2012-11-21 1 views
0

Quick picture to show what is happeningJava JSpinner картина дважды

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

И я переоцениваю метод краски здесь:

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. Вы звоните validate изнутри paint способом, который только собирается привести к компоненту начинают перекрасили, снова и снова и снова ... попрощайтесь с вашим процессором ...
  3. Вы избавляетесь от контекста графики, который вы не создали, это похоже на закрытие файла, который вы не открыли. Если вы его не создали, вы не должны закрывать его.
  4. Я не уверен, что у вас есть необходимость вызова Toolkit.getDefaultToolkit.sync();, но я достаточно уверен, что вы не должны делать это внутри paint метода
  5. Если у вас есть очень веские причины, чтобы сделать это иначе , вы не должны переопределять метод paint. Рекомендуемый метод для выполнения пользовательских живописи в это paintComponent метод (который вызывается paint)

Вы могли бы иметь чтения через

Обновление с примера

Fixed это для меня ...

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. Это не решило проблему, но это спасло мне несколько важных циклов процессора. Теперь я читаю ссылки, которые вы мне дали.Опять же, я ценю вклад. – Quinma

+0

Обновлено с примерами. У меня нет проблем с исправлениями – MadProgrammer

+0

Ответ правильный, я просто не использую правильные методы рисования моих компонентов. Еще раз спасибо. – Quinma