0

何が起こっているかを示す簡単な画像

上の図に示すように、JSpinner が 2 回表示されます。そこにあるべきではない点 (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. あなたはpaintComponent2回電話をかけています.1回は電話をかけsuper.paint、もう1回は手動です
  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 に答える