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确定需要创建组件时都将创建新组件。

组件应在您的类的构造函数中创建。

09-30 23:08