想象一下以下简单的Swing程序,其中包含三个Component
,一个JLabel
,一个JTextField
和一个JCheckBox
:
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JTextField;
import java.awt.GridLayout;
import javax.swing.JLabel;
import javax.swing.JCheckBox;
public class Example {
private JFrame frame;
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
Example window = new Example();
window.frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
public Example() {
initialize();
}
private void initialize() {
frame = new JFrame();
frame.setBounds(100, 100, 450, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(new GridLayout(0, 1, 0, 0));
JLabel lblNewLabel = new JLabel("FOO");
frame.getContentPane().add(lblNewLabel);
JTextField textField = new JTextField("BAZ");
frame.getContentPane().add(textField);
JCheckBox chckbxBar = new JCheckBox("BAR");
frame.getContentPane().add(chckbxBar);
}
}
现在,我们希望将所有Components
水平对齐到中心。这些Component
各自的类中的每一个都公开函数setHorizontalAlignment(int alignment)
,但是这些类没有这样做的公共超类。
我将如何在JFrame
中的每个组件或List<Component>
中的每个组件上多态调用此函数?
为了进一步阐明,如果存在一个称为CommonSuperclass
的通用超类,它公开了必要的功能,那么我将大致这样做:
List<Component> someSwingComponents = /*put some components in the list*/;
for (Component c : someSwingComponents) {
if (c instanceof CommonSuperclass) {
//component is horizontally alignable...
((CommonSuperclass) c).setHorizontalAlignment(SwingConstants.CENTER);
}
}
这对于某些{em> {1>},例如Component
,JCheckBox
和JRadioButton
(例如,通用超类将在为JToggleButton
,因为它确实具有所需的功能),但不适用于最接近的公共超类为JToggleButton
的{{1}},因为它是没有所需的功能。
目前,我想摆脱以下丑陋且冗长的代码:
Component
我考虑过使用接口java.awt.Component
,但是由于我不能(当然也不想)修改每个Swing if (component instanceof JLabel) {
((JLabel)component).setHorizontalAlignment(SwingConstants.CENTER);
} else if (component instanceof AbstractButton) {
((AbstractButton)component).setHorizontalAlignment(SwingConstants.CENTER);
}
/* And so on for every type of Component that has setHorizontalAlignment()... */
的类来实现IHorizontallyAlignable
,因此相反,它需要一种方法来表示这些类已经已经满足Component
接口的要求,因此尽管没有在IHorizontallyAlignable
上进行技术实现,也可以将其强制转换为该类。关键字。
我希望不需要像在窗口中水平对齐每个{水平对齐} IHorizontallyAlignable
这样简单的操作,但是如果您看不到其他方式,请发布基于反射的答案