我正在練習JList在單擊“添加數字”按鈕時填充亂數的 a,但我遇到了一些無法解決的問題。
在下面的代碼中,我放置了一個按鈕來切換串列的可見性狀態,但結果證明它不起作用,除非串列最初是可見的。
然后我將串列設定為顯示 8 行,但只顯示 7 行。
最后,如果只使用 3 個小數位,那么為什么水平滾動窗格會顯示出來,所以右邊有足夠的空間?
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.DecimalFormat;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
public class JListTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
listFrame myFrame=new listFrame();
myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
myFrame.setVisible(true);
}
}
class listFrame extends JFrame {
private static DecimalFormat df3 = new DecimalFormat("#.###");
public listFrame() {
setTitle("List demo");
setBounds(400,300,400,300);
listModel = new DefaultListModel();
randomNumberList=new JList(listModel);
//**********************************************************************
// the number of elements visible in the list turns out to be
// one less than the specified below
randomNumberList.setVisibleRowCount(8);
//**********************************************************************
randomNumberList.setFixedCellWidth(100);
JScrollPane scrollPanel=new JScrollPane(randomNumberList);
//**********************************************************************
// if this line is uncommented the button fails to make the list visible
// scrollPanel.setVisible(false);
//**********************************************************************
JPanel listPanel=new JPanel();
listPanel.add(scrollPanel);
JPanel textPanel=new JPanel();
toggle=new JButton("Toggle Visible");
toggle.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
scrollPanel.setVisible(!scrollPanel.isVisible());
}
});
textPanel.add(toggle);
addNumber=new JButton("Add Numbers");
addNumber.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
double min=0;
double max=1000;
double x= Math.random()*(max-min 1) min;
listModel.addElement(df3.format(x));
randomNumberList.ensureIndexIsVisible(listModel.getSize()-1);
}
});
textPanel.add(addNumber);
add(listPanel,BorderLayout.NORTH);
add(textPanel,BorderLayout.SOUTH);
}
private JButton toggle,addNumber;
private JList randomNumberList;
private DefaultListModel listModel;
}
更新:這是我在下面的評論中提到的一些代碼,其中 setVisibleRowCount 確實有效:
import java.awt.BorderLayout;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
public class JList_ShowMonths {
public static void main(String[] args) {
// TODO Auto-generated method stub
JFrame myLFrame=new MonthFrame();
myLFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
myLFrame.setVisible(true);
}
}
class MonthFrame extends JFrame {
private JList<String> monthList;
private JPanel listPanel,txtPanel;
private JLabel selectionLabel;
public MonthFrame() {
setTitle("Display the month names");
setBounds(400,300,400,300);
String [] months= {"January","February","March","April","May","June",
"July","August","September","October","November","December"};
monthList=new JList<String>(months);
monthList.setVisibleRowCount(4);
JScrollPane monthScroll=new JScrollPane(monthList);
listPanel=new JPanel();
listPanel.add(monthScroll);
monthList.addListSelectionListener(new ListSelectionListener(){
public void valueChanged(ListSelectionEvent e) {
List<String> values=monthList.getSelectedValuesList();
StringBuilder text=new StringBuilder("Selected month: ");
for (String element:values) {
String word=element;
text.append(word);
text.append(" ");
}
selectionLabel.setText(text.toString());
}
});
txtPanel=new JPanel();
selectionLabel=new JLabel("Mes seleccionado:");
txtPanel.add(selectionLabel);
add(listPanel,BorderLayout.NORTH);
add(txtPanel,BorderLayout.SOUTH);
}
}
uj5u.com熱心網友回復:
先上代碼。代碼后的說明。
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.text.DecimalFormat;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
public class LstFrame extends JFrame {
private static DecimalFormat df3 = new DecimalFormat("#.###");
private JButton toggle, addNumber;
private JList<Object> randomNumberList;
private DefaultListModel<Object> listModel;
public LstFrame() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setTitle("List demo");
listModel = new DefaultListModel<Object>();
randomNumberList = new JList<>(listModel);
randomNumberList.setVisibleRowCount(8);
randomNumberList.setFixedCellWidth(100);
JScrollPane scrollPanel = new JScrollPane(randomNumberList);
scrollPanel.setPreferredSize(new Dimension(110, 100));
scrollPanel.setVisible(false);
JPanel textPanel = new JPanel();
toggle = new JButton("Toggle Visible");
toggle.addActionListener(e -> {
scrollPanel.setVisible(!scrollPanel.isVisible());
revalidate();
});
textPanel.add(toggle);
addNumber = new JButton("Add Numbers");
addNumber.addActionListener(e -> {
double min = 0;
double max = 1000;
double x = Math.random() * (max - min 1) min;
listModel.addElement(df3.format(x));
randomNumberList.ensureIndexIsVisible(listModel.getSize() - 1);
});
textPanel.add(addNumber);
add(scrollPanel, BorderLayout.CENTER);
add(textPanel, BorderLayout.SOUTH);
setSize(260, 240);
setLocationByPlatform(true);
setVisible(true);
}
public static void main(String[] args) {
EventQueue.invokeLater(() -> new LstFrame());
}
}
如果一個組件最初是不可見的,它不會被繪制,其余的組件也不會以為不可見的組件留出空間的方式進行繪制。因此,在上面的代碼中,我設定了JFrame. 我只是玩弄數字,直到找到合適的值。
是的,[內容窗格] 的默認布局管理器JFrame是
按Toggle Visibe 后

添加十個 [隨機] 數字后 - 因為 的首選高度JScrollPane足以顯示九個數字。

uj5u.com熱心網友回復:
嗨,你已經得到了上面的答案,抱歉,我認為如果我們有 4 個匯入陳述句,這很容易閱讀
import java.awt.*;
import java.awt.event.*;
import java.text.*;
import javax.swing.*;
這里 (.*) 匯入包的所有類。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/337613.html
