我正在创建一个像这样的JList:
JScrollPane scrollPane = new JScrollPane();
scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
GridBagConstraints gbc_scrollPane = new GridBagConstraints();
gbc_scrollPane.insets = new Insets(0, 0, 5, 5);
gbc_scrollPane.fill = GridBagConstraints.BOTH;
gbc_scrollPane.gridx = 0;
gbc_scrollPane.gridy = 1;
contentPanel.add(scrollPane, gbc_scrollPane);
{
JList listAvail = new JList();
listAvail.setBorder(new TitledBorder(null, "", TitledBorder.LEADING, TitledBorder.TOP, null, null));
scrollPane.setViewportView(listAvail);
}
并且我在点击按钮时尝试访问它:
JButton btnAdd = new JButton("Add ->");
btnAdd.addMouseListener(new MouseAdapter()
{
@Override
public void mouseClicked(MouseEvent arg0)
{
if (!listAvail.isSelectionEmpty())
{
int[] selects = listAvail.getSelectedIndices();
for (int i = selects.length - 1; i >= 0; i--)
{
appliedM.add(0, availM.getElementAt(selects[i]));
appliedFeatures.add(0, availFeatures.get(selects[i]));
availFeatures.remove(availFeatures.get(selects[i]));
availM.remove(selects[i]);
}
}
}
});
当然,我收到一条错误,说“listAvail无法解析”,因为它超出了按钮的范围。是否有getter方法或深入到特定组件的方法?我正在考虑以下几点:
contentPanel.scrollPane.listAvail
必须有一些我缺少的东西,但我在文档中没有看到过这样的东西。
编辑:我特别要求深入研究摆动组件。这不是通用的变量范围问题,也不是引用问题的精确副本。在编辑时,这个问题尚未得到解答。
答案 0 :(得分:2)
你的问题归结为 - 当一个对象引用被分配给一个非常本地化的变量时,如何访问该对象引用,这里的对象是JList,它被分配给的变量是listAvail
,变量埋在自己的花括号中(为什么?)在方法或构造函数中。
解决方案 - 获取本地范围的变量声明 out ,并使其成为该类的实例字段。如,
public class MyClass {
private JList listAvail = new JList(); // should be generic btw
另一个问题是:
btnAdd.addMouseListener(new MouseAdapter() {....
不要将MouseListener与JButton一起使用,其中ActionListener更合适。如果您希望在禁用按钮本身时禁用按钮的操作,则会产生分支。