在扩展JPanel(Java)的类中添加ScrollPane

时间:2018-08-19 15:50:30

标签: java jpanel scrollbar jscrollpane jscrollbar

我已经创建了一个扩展JPanel的类,在该类中有不同的JPanel(我像容器一样使用它),它们都具有GridBagLayout

我有一个信息列表,对于每个信息,我都应该创建一个Button,因此,放置所有按钮的JPanel应该有一个滚动条。

这是我应该做的:

this is what I should do

这是在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和其他一些组件的类?

0 个答案:

没有答案