2012-11-21 78 views
0

Quick picture to show what is happeningJava JSpinner繪畫兩次

JSpinner出現兩次,如上圖所示。點(0,0)處的第一個不應出現的外觀不可選,不可編輯或可使用,而沒有微調按鈕。

這裏的奇怪之處在於,每個其他組件都沒有問題。只有jspinner。我正在使用Java 7並在Netbeans中開發(而不是gui開發工具包)。這是Java 7的錯誤嗎?如果不是,我可以嘗試在我指定的區域中只使用一次JSpinner塗料?

代碼來說明這個問題:

我將它添加到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)); 
} 

我在這裏覆蓋塗裝方法:

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(); 
} 
+0

爲了更好地幫助越早,張貼[SSCCE(HTTP:// sscce.org/)。 –

回答

2
  1. 你打電話paintComponent兩次,一次是當你調用super.paint和一次手動
  2. 你從paint方法,只會導致組件中調用validate開始重新粉刷一遍又一遍又一遍...說再見你的CPU ...
  3. 你正在處理你沒有創建的圖形上下文,這就像關閉一個你沒有打開的文件。如果你沒有創建它,你不應該關閉它。
  4. 我不相信你有一個需要調用Toolkit.getDefaultToolkit.sync();,但我有理由相信,你不應該從paint方法
  5. 內做,除非你有一個很好的理由這樣做,否則,你不應該重寫paint方法。推薦的方法來進行自定義繪圖中是paintComponent方法(這是由paint調用)

你可能想通過

有一個讀用示例更新

固定它,我...

enter image description hereenter image description here

留下的是你的代碼,右邊是我的

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); 
     } 
    } 
} 
+0

非常有趣,謝謝。我已經實施了1-4。它沒有解決問題,但它確實爲我節省了一些重要的CPU週期。我現在正在閱讀你給我的鏈接。再次,我很欣賞這些意見。 – Quinma

+0

以示例更新。我沒有修復問題 – MadProgrammer

+0

你的回答是正確的,我只是沒有使用正確的方法來繪製我的組件。再次感謝你。 – Quinma