gpt4 book ai didi

java - JPanel 未显示

转载 作者:行者123 更新时间:2023-12-01 11:39:41 24 4
gpt4 key购买 nike

我直接从书中复制了示例。代码应该在 JFrame 上绘制一些内容,但没有显示任何内容(除了 JFrame 之外)这是具有 main 方法的类

import java.awt.BorderLayout;
import javax.swing.JFrame;

public class JavaApplication24 {

/**
* @param args the command line arguments
*/
public static void main(String[] args) {
JFrame frame = new JFrame("Window");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

frame.setSize(480,270);

frame.setVisible(true);
NewClass panel = new NewClass();

frame.add(BorderLayout.CENTER, panel);

}

这是 JPanel 的子类

import java.awt.Graphics;
import java.awt.Color;
import javax.swing.JPanel;


public class NewClass extends JPanel {

@Override
public void paintComponent(Graphics g){
g.setColor(Color.BLUE);
g.fillRect(0,0,100,100);

g.setColor(Color.GREEN);
g.drawRect(50,50,100,100);

g.setColor(Color.RED);
g.drawString("Hello",200,200);

g.setColor(Color.RED);
g.fillOval(240,40,100,30);

}
}

最佳答案

问题#1

您的 NewClass 应提供大小调整提示,布局管理器(本例中为 BorderLayout)可以决定如何最好地布局组件。

在进行任何自定义绘画之前,您还应该调用 super.paintComponent,否则最终将出现无休止的渲染伪影

public class NewClass extends JPanel {

@Override
public Dimension getPreferredSize() {
return new Dimension(400, 400);
}

@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.BLUE);
g.fillRect(0, 0, 100, 100);

g.setColor(Color.GREEN);
g.drawRect(50, 50, 100, 100);

g.setColor(Color.RED);
g.drawString("Hello", 200, 200);

g.setColor(Color.RED);
g.fillOval(240, 40, 100, 30);

}
}

I copied the examples straight from the book

我希望你只是犯了一些小错误,否则我会担心这本书的有效性:P

您还应该从事件调度线程的上下文中启动 UI,这往往可以解决不同平台上可能出现的问题...

public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}

JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new NewClass());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}

参见Initial Threads了解更多详情

问题#2

在建立 UI 之前,不应使其可见,而不是

frame.setVisible(true);
NewClass panel = new NewClass();

frame.add(BorderLayout.CENTER, panel);

使用更像...的东西

NewClass panel = new NewClass();
frame.add(BorderLayout.CENTER, panel);
frame.setVisible(true);

有多种方法可以在框架可见后触发和更新,但这只是最简单的修复

关于java - JPanel 未显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29641074/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com