0

快速图片显示正在发生的事情

如上图所示,JSpinner 出现了两次。在点 (0,0) 的第一次出现不应该出现在没有微调按钮的情况下是不可选择、不可编辑或不可使用的。

奇怪的是,其他所有组件都没有问题。只有jspinner。我正在使用 Java 7 并在 Netbeans(不是 gui 开发人员工具包)中进行开发。这是java 7的错误吗?如果不是,我可以尝试让我的 JSpinner 在我指定的区域仅绘制 1 次?

说明问题的代码:

我将它添加到 JPanel 的子类中,如下所示:

public class MyCustomGUI extends JPanel {
private JSpinner entrySpinner;
public MyCustomGUI () {
 super(null);
 this.setDoubleBuffered(true);

 entrySpinner = new JSpinner(new SpinnerNumberModel(0, 0, Integer.MAX_VALUE, 1));
 add(entrySpinner);
....

我有一种方法可以给它一个位置:

public void resize() {
     entrySpinner.setBounds((int) (this.getWidth() * .2), (int) (this.getHeight() * 0.38), (int) (this.getWidth() * 0.3), (int) (this.getHeight() * 0.1));
}

我在这里覆盖了paint方法:

public void paint(Graphics g) {
    super.paint(g);
    Graphics2D g2d = (Graphics2D) g;
    g2d.setRenderingHint(
            RenderingHints.KEY_TEXT_ANTIALIASING,
            RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
    .. draw shapes..
    super.paintComponents(g);
    super.validate();
    Toolkit.getDefaultToolkit.sync();
    g.dispose();
}
4

1 回答 1

2
  1. 你打paintComponent了两次电话,一次是你打电话的时候super.paint,一次是手动的
  2. validate从一个paint方法中调用,该方法只会导致组件开始重新绘制,一遍又一遍……与你的 CPU 说再见……
  3. 你正在处理你没有创建的图形上下文,这就像关闭一个你没有打开的文件。如果您没有创建它,则不应关闭它。
  4. 我不相信你需要打电话Toolkit.getDefaultToolkit.sync();,但我有理由相信你不应该在paint方法中这样做
  5. 除非您有充分的理由这样做,否则您不应该覆盖该paint方法。执行自定义绘画的推荐方法是paintComponent方法(由 调用paint

您可能想通读

更新示例

为我修好了...

在此处输入图像描述在此处输入图像描述

左边是你的代码,右边是我的

public class TestPaintSpinner {

    public static void main(String[] args) {
        new TestPaintSpinner();
    }

    public TestPaintSpinner() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        public TestPane() {
            setDoubleBuffered(true);
            setLayout(new GridBagLayout());
            add(new JSpinner(new SpinnerNumberModel(0, 0, Integer.MAX_VALUE, 1)));

            JPanel panel = new JPanel();
            panel.add(new JLabel("Subpanel"));
            add(panel);
        }

//        public void paint(Graphics g) {
//            super.paint(g);
//
//            Graphics2D g2d = (Graphics2D) g;
//            Point2D sPoint = new Point2D.Float(0, 0);
//            Point2D ePoint = new Point2D.Float(this.getWidth(), this.getHeight());
//
//            g2d.setRenderingHint(
//                    RenderingHints.KEY_TEXT_ANTIALIASING,
//                    RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
//            super.paintComponents(g);
//            super.validate();
//            Toolkit.getDefaultToolkit().sync();
//            g.dispose();
//        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g); //To change body of generated methods, choose Tools | Templates.

            Graphics2D g2d = (Graphics2D) g;
            Point2D sPoint = new Point2D.Float(0, 0);
            Point2D ePoint = new Point2D.Float(this.getWidth(), this.getHeight());

            // Note, this will effect every component painted after this one!!
            g2d.setRenderingHint(
                    RenderingHints.KEY_TEXT_ANTIALIASING,
                    RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
        }
    }
}
于 2012-11-21T00:18:25.093 回答