Linux上的Java 1.8.0_60。创建一个JFrame,将JDesktopPane设置为其内容窗格,并用于在任意位置显示一些线形图形以及JInternalFrames。似乎某些调用或调用位置导致无法通过单击“ x”破坏JFrame的状态。
这些是课程;而不是注释“ X1”和“ X2”。
import java.awt.*;
import javax.swing.*;
public class InternalFrameEventDemo extends JFrame {
public InternalFrameEventDemo(String title) {
super(title);
JDesktopPane desktop = new MyDesktop();
this.setContentPane(desktop);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.pack();
this.setVisible(true);
}
private class MyDesktop extends JDesktopPane {
public MyDesktop(){
this.setPreferredSize(new Dimension(500,300));
}
public void paintComponent( Graphics sg ) {
super.paintComponent( sg );
new StarLabel( this, 100, 100, "Here at 100" ); // X1
new StarLabel( this, 200, 200, "Here at 200" );
}
}
public static void main(String[] args) {
//Schedule a job for the event-dispatching thread:
//creating and showing this application's GUI.
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
JFrame frame = new InternalFrameEventDemo("InternalFrameEventDemo");
}
});
}
}
StarLabel
import java.awt.*;
import javax.swing.*;
public class StarLabel extends JInternalFrame {
public StarLabel( JComponent panel, int x, int y, String text ) {
super( null, false, true, false, false );
this.setBorder( null );
((javax.swing.plaf.basic.BasicInternalFrameUI) this.getUI()).setNorthPane(null);
this.setVisible( true );
this.setOpaque( false ); // X2
this.add( new JLabel( text ) );
this.pack();
this.setLocation( x, y );
panel.add( this );
}
}
X1:如果未在
paintComponent
中进行StarLabel构造函数调用,则效果仍然不存在。X2:如果未将setOpaque设置为false,则效果也不会发生。
现在,我可以将setOpaque与true一起使用-false完全是偶然。但是我仍然想知道我是否违反了小字中的其中一项规则?要么...?
最佳答案
但是我仍然想知道我是否违反了小字中的其中一项规则?
是。
如果未在paintComponent中进行StarLabel构造函数调用,则该效果仍然不存在。
绘画方法仅用于绘画。
永远不要在绘画方法中创建Swing组件。您无法控制何时调用绘画方法,因此每次Swing确定需要创建组件时都将创建新组件。
组件应在您的类的构造函数中创建。