2012-11-21 43 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