我已经创建了一个扩展JPanel
的类,在该类中有不同的JPanel
(我像容器一样使用它),它们都具有GridBagLayout
。
我有一个信息列表,对于每个信息,我都应该创建一个Button
,因此,放置所有按钮的JPanel
应该有一个滚动条。
这是我应该做的:
这是在JPanel“ contentList”中创建按钮的方法
private void refreshNoteList(MainView view){
contentList.removeAll();
contentList.revalidate();
contentList.setLayout(new GridBagLayout());
GridBagConstraints gc = new GridBagConstraints();
for (int i=0; i<notes.size(); i++){
gc = new GridBagConstraints();
JLabel lbl_title = new JLabel();
String titolo=notes.get(i).getTitle();
StringBuffer str= new StringBuffer();
int count=0;
//per ragioni di semplicità il titolo non può contenere più di 15 caratteri
for (char c : titolo.toCharArray()) {
if(count<15){
str.append(c);
}
else{
str.append("...");
break;
}
count++;
}
lbl_title.setText(str.toString());
lbl_title.setHorizontalAlignment(SwingConstants.LEFT);
lbl_title.setVerticalAlignment(SwingConstants.CENTER);
lbl_title.setPreferredSize(new Dimension(100, 20));
gc.gridx = 0;
gc.gridy = i;
gc.fill=GridBagConstraints.BOTH;
gc.insets = new Insets(10, 10, 10, 10);
contentList.add(lbl_title,gc);
gc = new GridBagConstraints();
JLabel lbl_name = new JLabel();
//per ragioni di semplicità il corpo, nella isualizzazione ad elenco, non può contenere più di 20 caratteri
String corpo=notes.get(i).getBody();
str= new StringBuffer();
count=0;
for (char c : corpo.toCharArray()) {
if(count<20){
str.append(c);
}
else{
str.append("...");
break;
}
count++;
}
lbl_name.setText(str.toString());
lbl_name.setHorizontalAlignment(SwingConstants.LEFT);
lbl_name.setVerticalAlignment(SwingConstants.CENTER);
lbl_name.setPreferredSize(new Dimension(300, 20));
gc.gridx = 1;
gc.gridy = i;
gc.insets = new Insets(10, 10, 10, 10);
gc.fill=GridBagConstraints.BOTH;
contentList.add(lbl_name,gc);
gc = new GridBagConstraints();
JButton btn_modify = new JButton("M");
btn_modify.setPreferredSize(new Dimension(20, 20));
gc.gridx = 2;
gc.gridy = i;
gc.weightx=0;
gc.insets = new Insets(10, 10, 10, 10);
gc.fill=GridBagConstraints.BOTH;
contentList.add(btn_modify,gc);
btn_modify.setToolTipText("Modifica");
btn_modify.setActionCommand(corpo);
btn_modify.setEnabled(false);
btn_modify.addMouseListener(new MouseAdapter() {
@Override
public void mouseEntered(MouseEvent arg0) {
btn_modify.setEnabled(true);
}
@Override
public void mouseExited(MouseEvent e) {
btn_modify.setEnabled(false);
}
});
btn_modify.setToolTipText("Modify this note");
btn_modify.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
temporanyLabels= new ArrayList<>();
nuova=false;
modifica=true;
if (view.isPinned(lbl_title.getText()))
btnPin.setBackground(Color.RED);
else
btnPin.setBackground(new JButton().getBackground());
chckbxPublic.setSelected(view.isPublic(lbl_title.getText()));
textFieldTitleNote.setText(lbl_title.getText());
textAreaNote.setText(btn_modify.getActionCommand());
temporanyLabels= view.getLabelsByNote(lbl_title.getText());
modifyID= view.getIDbyTitle(lbl_title.getText());
refreshLabelPanel(view);
}
});
}
contentList.repaint();
textFieldTitleNote.setText("Select one note...");
textAreaNote.setText("");
repaint();
System.out.println("refresh");
}
现在contentList
充满了我无法全部看到的元素。
第一个尝试是创建一个JScrollPane
:
JScrollPane scroll= new JScrollPane(contentList);
add(JScrollPane);
但滚动条没有出现...
我还认为要创建另一个JPanel
并将其用作contentList的容器
JPanel content= new JPanel();
content.add(contentList);
JScrollPane scroll= new JScrollPane(content);
add(JScrollPane);
但是即使这样,滚动条也不会出现。 如果我在独立的主类上尝试此方法,它将起作用(这里是一个示例):
public class Main {
public static void main(String[] args) {
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
int x = 5;
int y = 5;
JPanel panel = new JPanel();
panel.setLayout(new GridLayout(x, y));
for (int i = 0; i < x * y; i++) {
JButton button = new JButton(String.valueOf(i));
button.setPreferredSize(new Dimension(100, 100));
panel.add(button);
}
JPanel container = new JPanel(new FlowLayout(FlowLayout.CENTER, 0, 0));
container.add(panel);
JScrollPane scrollPane = new JScrollPane(container);
f.getContentPane().add(scrollPane);
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
}
}
由于这个原因,我认为问题是我应该在一个扩展JPanel
的简单类中而不是在一个新的Frame中创建一个滚动条,并且只有一秒钟之后,我才应该在我的主要班级。
因此,我尝试将下面示例的代码放入扩展JPanel
的类中,然后在主类中使用该类:滚动条不起作用。
我读到有必要在主类中添加以下内容:
frame.add(new JScrollPane("name of the class that extend JPanel"));
以这种方式起作用,但是如果我在扩展JPanel (contentList)
的类中有多个容器,则scrollBar不起作用。
问题是:如果我有一个用多个面板扩展JPane
的类,那么我该如何在其中一些面板上添加滚动条,然后在主菜单中像Component
那样使用该类呢?带有JFrame
和其他一些组件的类?