我直接从书中复制了这些例子。代码应该在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);
}
}
答案 0 :(得分: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);
}
}
我直接从书中复制了这些例子
我希望你犯了一些小错误,否则我会担心这本书的有效性: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
在您建立之前,不应该让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);
有一些方法可以在框架可见后触发和更新,但这只是最简单的修复