加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 每次调用ActionListener时,如何明显更改JScrollPane的内

发布时间:2020-12-15 04:08:10 所属栏目:Java 来源:网络整理
导读:每次调用Action Listener时,我都希望这个JScrollPane将其列表更改为完全不同的列表.我不完全确定如何做到这一点.我已经尝试更改JList,重新绘制ScrollPane并重新验证它,但它没有带来预期的效果.我写了一个可编辑的迷你程序,在这里解释了我的问题: import jav
每次调用Action Listener时,我都希望这个JScrollPane将其列表更改为完全不同的列表.我不完全确定如何做到这一点.我已经尝试更改JList,重新绘制ScrollPane并重新验证它,但它没有带来预期的效果.我写了一个可编辑的迷你程序,在这里解释了我的问题:

import javax.swing.*;
import javax.swing.border.TitledBorder;
import java.awt.*;
import java.awt.event.*;
import java.sql.SQLException;

@SuppressWarnings("serial")
public class TestFrame extends JFrame {
public final Dimension SCROLL_PANE_DIMENSION = new Dimension(200,100);
private JComboBox<String> comboNames;
private JPanel panel = new JPanel();
private JList<String> availableList;
private JScrollPane theScrollPane;
private boolean string1Used = true;
String[] strings = { "Aaardvark","Adam","Alms" };
String[] strings2 = { "Bad","Bugs","Bunny" };

public static void main(String[] args){
    try {
        TestFrame frame = new TestFrame();
        frame.setVisible(true);
    } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

public TestFrame() throws SQLException {
    String[] comboStrings = { "Doesn't","matter","here" };

    this.setSize(300,200);

    availableList = new JList<String>(strings);

    theScrollPane = new JScrollPane(availableList);

    theScrollPane = new JScrollPane(availableList);
    theScrollPane.setPreferredSize(SCROLL_PANE_DIMENSION);
    theScrollPane.setSize(SCROLL_PANE_DIMENSION);
    theScrollPane.setBorder(BorderFactory.createTitledBorder(
            BorderFactory.createEtchedBorder(),"Sub Conditions",TitledBorder.CENTER,0));

    availableList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    availableList.setSelectedIndex(0);
    availableList.setVisibleRowCount(5);
    availableList.setSize(SCROLL_PANE_DIMENSION);

    comboNames = new JComboBox<String>(comboStrings);

    comboNames.addActionListener(new ConditionComboListener());

    panel = new JPanel();


    this.add(panel);


    panel.add(comboNames);
    panel.add(theScrollPane);

}

private class ConditionComboListener implements ActionListener {

    @Override
    public void actionPerformed(ActionEvent arg0) {
        refreshSubConditionList();
    }

    private void refreshSubConditionList() {
        if (string1Used) {
            System.out.println("Switching to Strings2");
            availableList = new JList<String>(strings2);
            string1Used = false;
        } else{
            System.out.println("Switching to Strings");
            availableList = new JList<String>(strings);
            string1Used = true;
        }
        theScrollPane = new JScrollPane(availableList);
        theScrollPane.revalidate();
        theScrollPane.repaint();
    }

}

}

在这个例子中,每当我更改JComboBox中的内容时,我希望JScrollPane内的列表在数组strings1和strings2之间切换.我也希望这个改变是可见的,因为我改变了组合框中的内容,而不是以后.正如您从编译的代码中看到的那样,它并没有那么好用.我究竟做错了什么?为什么我不希望它改变列表?

解决方法

创建新的滚动窗格不会将滚动窗格添加到面板.

无论如何,没有必要继续创建一个新的滚动窗格.只需更改滚动窗格中显示的组件:

//theScrollPane = new JScrollPane(availableList);
//theScrollPane.revalidate();
//theScrollPane.repaint();
theScrollPane.setViewportView(availableList);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读