Итак, я разрабатываю визуальный дизайнер в стиле перетаскивания на Java с использованием Swing.
Поскольку компоненты, которые вы видите в дизайнере, не являются фактическими компонентами, а являются только визуальным представлением (например, кнопки нельзя нажимать, текстовые поля не могут принимать текст и т. д.), я рисую их прямо на своей панели, переопределяя методы getX()
, getY()
, getWidth()
и getHeight()
.
Он отлично работает на любом LookAndFeel, кроме WindowsLookAndFeel. Там почему-то не рисуются фоны JButtons. Мне приходится использовать Windows LookAndFeel для дизайнера, потому что именно так развертывается наше программное обеспечение, и если я использую другой LookAndFeel, макет дизайнера не будет таким же, как наше программное обеспечение.
Я потерял несколько часов, пытаясь решить эту проблему, и я подозреваю, что это происходит потому, что, не добавляя JButton в контейнер, его собственный одноранговый узел не был создан. Я пытался создать пир вручную, но безуспешно.
Я заметил эту проблему в Windows 7 (с Aero) и Windows 8. Если я использую классическую тему в Windows 7, она работает, поэтому я предполагаю, что она также работает в Windows XP (но я не проверял это). Я использую Java 1.7.0_25-b17, чтобы проверить это.
Вот пример, который я сделал, чтобы показать проблему:
package test;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class TestSwing {
public static void main(String[] args) {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { }
JFrame f = new JFrame();
f.setSize(300, 150);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.getContentPane().setLayout(new BoxLayout(f.getContentPane(), BoxLayout.X_AXIS));
JPanel p1 = new JPanel();
p1.setPreferredSize(new Dimension(150, 150));
p1.setBorder(BorderFactory.createLineBorder(Color.yellow));
p1.add(new JButton("Test"));
f.add(p1);
final MyButton b = new MyButton();
b.addNotify();
JPanel p2 = new JPanel() {
@Override
public void paint(Graphics g) {
super.paint(g);
b.paint(g);
}
};
p2.setPreferredSize(new Dimension(150, 150));
p2.setBorder(BorderFactory.createLineBorder(Color.red));
f.add(p2);
f.setVisible(true);
}
private static class MyButton extends JButton {
public MyButton() {
super("Test");
}
@Override
public int getWidth() {
return 70;
}
@Override
public int getHeight() {
return 25;
}
}
}
Вот пример использования WindowsLookAndFeel:
А вот с MetalLookAndFeel:
java version "1.7.0_10
в Windows 7. У меня та же проблема, что и у вас. Так что это похоже на проблему версии. - person camickr   schedule 08.03.2014