2015-05-16 9 views
0

Я создал пользовательский интерфейс с подвижными компонентами. Когда я создаю один, он выглядит как самая большая фотография. Как только я начинаю перемещать его, пространство вокруг кнопки становится черным, как видно посередине. Когда я перехожу в другое окно (например, сафари), пространство вокруг радиоокна также становится черным. Любые идеи почему?Странные черные границы вокруг JComponents в Swing Java

enter image description here

enter image description here

EDIT:

Комбинированный 3button представляет собой расширенный класс JPalet что встраиваются в другой панели JPanel1, что в кадре. Как только я переутверждаю и перекрашу в JPanel1, ошибка снова исчезнет. Или когда я простреливаю одну 3 баттона над другой (что, вероятно, также вызывает перерисовку).

Я двигаюсь 3button вокруг с MouseMotionListener наклеенного на JButton с MouseAdapter MouseDrag

EDIT:

Надеется, что это фрагмент кода достаточно мала.

import java.awt.Point; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import javax.swing.*; 

public class UiTestFrame { 

    public UiTestFrame() { 
     buildUi(); 
    } 

    void buildUi() { 
     JFrame frame = new JFrame("TestFrame"); 

     XButton jButton = new XButton(); 
     frame.add(jButton); 
     jButton.setSize(jButton.getPreferredSize()); 
     jButton.setLocation(10, 10); 
     frame.revalidate(); 
     frame.repaint(); 

     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setResizable(false); 

     frame.setSize(500, 500); 
     frame.setVisible(true); 
    } 

    private class XButton extends javax.swing.JPanel { 

     public XButton() { 

      initComponents(); 
      jButton1.addMouseMotionListener(new MotionEvent(this)); 
     } 

     private void initComponents() { 

      jButton1 = new javax.swing.JButton(); 
      jRadioButton1 = new javax.swing.JRadioButton(); 
      jRadioButton2 = new javax.swing.JRadioButton(); 

      setBackground(new java.awt.Color(0, 0, 0, 0f)); 
      setPreferredSize(new java.awt.Dimension(130, 30)); 
      setLayout(null); 

      jButton1.setText("jButton1"); 
      jButton1.setAlignmentY(0.0F); 
      jButton1.setContentAreaFilled(false); 
      jButton1.setFocusPainted(false); 
      jButton1.setFocusable(false); 
      jButton1.setMargin(new java.awt.Insets(-2, -2, -2, -2)); 
      add(jButton1); 
      jButton1.setBounds(19, 0, 90, 30); 

      jRadioButton1.setEnabled(false); 
      jRadioButton1.setFocusable(false); 
      add(jRadioButton1); 
      jRadioButton1.setBounds(0, 0, 20, 30); 

      jRadioButton2.setEnabled(false); 
      jRadioButton2.setFocusable(false); 
      jRadioButton2.setName(""); // NOI18N 
      add(jRadioButton2); 
      jRadioButton2.setBounds(100, 0, 30, 30); 
     } 

     private javax.swing.JButton jButton1; 
     private javax.swing.JRadioButton jRadioButton1; 
     private javax.swing.JRadioButton jRadioButton2; 

    } 

    private class MotionEvent extends MouseAdapter { 

     javax.swing.JComponent button; 
     Point pt; 

     public MotionEvent(javax.swing.JComponent button) { 
      this.button = button; 
     } 

     public void mouseMoved(MouseEvent e) { 
      pt = e.getPoint(); 
     } 

     public void mouseDragged(MouseEvent e) { 
      Point p = SwingUtilities.convertPoint(button, e.getPoint(), button.getParent()); 
      button.setLocation(p.x - pt.x, p.y - pt.y); 
     } 
    } 
} 
+2

Вы сами рисуете? Как вы его перемещаете? Если возможно, пожалуйста, используйте [минимальный, полный пример] (http://stackoverflow.com/help/mcve), который воспроизводит поведение. – Radiodef

+0

Получил минимальный рабочий пример, см. Edit – Josephus87

ответ

2
setBackground(new java.awt.Color(0, 0, 0, 0f)); 

Тогда проблема заключается в использовании прозрачного цвета, так что фон не красили должным образом.

Вместо этого вы можете использовать:

setOpaque(false); 

Для получения дополнительной информации о том, почему прозрачность может вызвать проблемы проверить Background With Transparency.

Кроме того, не используйте нулевой макет. Вы можете использовать простой BorderLayout. Добавьте переключатели в BorderLayout.LINE_START и BorderLayout.LINE_END и кнопку BorderLayout.CENTER.

При использовании менеджеров компоновки компонент будет определять предпочтительный размер компонентов, чтобы его можно было использовать на других панелях. В противном случае вам нужно будет переопределить методы вашего компонента, чтобы вернуть нужный размер getPreferredSize() и getMinimumSize() и getMaximumSize().

 Смежные вопросы

  • Нет связанных вопросов^_^