JToggleButton обрезает текст метки
Когда используется в Windows 7
JToolBar
, JToggleButton
иногда обрезает текст метки.
Смотрите пример в коде ниже. Кнопка переключения, которая начинается с заглавной буквы 'W'
будет усечено; тот, который начинается с пробела (или даже в нижнем регистре 'w'
) не буду.
Это происходит только под Windows
? Может кто-нибудь объяснить, почему это происходит?
// http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6386636
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JFrame;
import javax.swing.JToggleButton;
import javax.swing.JToolBar;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
/////////////////////// new class
public class Truncation_Example extends JToolBar {
private static final long serialVersionUID = 1L;
/////////////////////// object attributes
JToggleButton toggle_Good;
JToggleButton toggle_Bad;
/////////////////////// constructors
public Truncation_Example() {
toggle_Good = new JToggleButton(new Action_Good());
toggle_Bad = new JToggleButton(new Action_Bad());
this.add(toggle_Good);
this.add(toggle_Bad);
}
/////////////////////// inner classes
public class Action_Good extends AbstractAction {
private static final long serialVersionUID = 1L;
public Action_Good() {
putValue(Action.NAME, " Wrap Good "); // note added space to prevent truncation
}
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("Toggle: " + toggle_Good.getText());
}
}
public class Action_Bad extends AbstractAction {
private static final long serialVersionUID = 1L;
public Action_Bad() {
putValue(Action.NAME, "Wrap Bad"); // label will be truncated if it begins with 'W'
}
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("Toggle: " + toggle_Bad.getText());
}
}
/////////////////////// main
public static void main(String[] args) {
UIManager.put("ToggleButton.select", Color.GREEN);
SwingUtilities.invokeLater(new Runnable() {
public void run() {
JFrame frame = new JFrame("Truncation_Example");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JToolBar toolBar = new Truncation_Example();
frame.add(toolBar, BorderLayout.NORTH);
frame.setSize(500, 400);
frame.setVisible(true);
}
});
}
}
1 ответ
Эта проблема зависит от LookAndFeel, позвольте мне объяснить, почему...
Этот пример действительно обрезает текст, если установлен MetalLookAndFeel (по умолчанию). С любым другим L&F (Basic, Windows, Nimbus, даже на моем собственном L&F) я не вижу этой проблемы. Похоже, что в MetalLookAndFeel есть какая-то ошибка в MetalButtonUI или в константах L & F, которая вынуждает некорректно отображать текст кнопки.
Я не уверен, что это может быть - вы можете просто отладить класс MetalButtonUI, чтобы увидеть, что происходит в вычислениях размеров. В любом случае, я сомневаюсь, что вы что-то измените, даже если вы найдете корень этой проблемы.