Java 滚动窗格添加到网格布局

Java 滚动窗格添加到网格布局,java,mysql,swing,jscrollpane,windowbuilder,Java,Mysql,Swing,Jscrollpane,Windowbuilder,在我的代码中,我调用了几个itemsmy按钮,它们的名称指向不同的项目。名称和所有内容都来自数据库 我想要一个J滚动窗格围绕我的按钮,我能做什么?我只想在滚动窗格中调用按钮。这是我的密码 import java.sql.*; import java.util.ArrayList; import java.util.List; import java.awt.GridLayout; import javax.swing.JFrame; import javax.swing.JOptionPa

在我的代码中,我调用了几个itemsmy按钮,它们的名称指向不同的项目。名称和所有内容都来自数据库 我想要一个J滚动窗格围绕我的按钮,我能做什么?我只想在滚动窗格中调用按钮。这是我的密码

import java.sql.*;
import java.util.ArrayList;

import java.util.List;

import java.awt.GridLayout;

import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JLabel;

import javax.swing.JButton;

import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;


public class AdminClass implements ActionListener  {

ProjectButton[] buttons = new ProjectButton[35];

//Creating data field for unique Ids in the form of array list
ArrayList<Integer> uniqueIDList = new ArrayList<Integer>();
String[] projectNames;
int[] uniqueIds;

Connection conn1 = null;
Statement stmt1 = null;

JFrame frame = new JFrame("Admin Panel");
private JPanel panel = new JPanel();
JButton btnNewButton = new JButton("Add New Project");

public AdminClass() {

    panel.setLayout(new GridLayout(10, 1));

    panel.add(new JLabel("Welcome to Admin Panel"));

    btnNewButton.addActionListener(this);
    panel.add(btnNewButton);

    panel.add(new JLabel("Existing Projects"));

    conn1 = sqliteConnection.dbConnector();

    try{
          Class.forName("org.sqlite.JDBC");
          conn1.setAutoCommit(false);
          stmt1 = conn1.createStatement();
          ResultSet rs1 = stmt1.executeQuery( "SELECT * FROM Project;" );

          List<String> projectNameList = new ArrayList<String>();

          while ( rs1.next() ){
              int id = rs1.getInt("uniqueid");
              String projectName = rs1.getString("name");

              projectNameList.add(projectName);
              uniqueIDList.add(id);
          }

          // Converting array list to array
          projectNames = new String[projectNameList.size()];
          projectNameList.toArray(projectNames);

          uniqueIds = convertIntegers(uniqueIDList);


          rs1.close();
          stmt1.close();
          conn1.close();
    }
    catch ( Exception e1 ) {
        JOptionPane.showMessageDialog(null, e1);    
    }

    // Adding buttons to the project
    try{
        for (int i = 0; i < projectNames.length; i++){
            buttons[i] = new ProjectButton(projectNames[i]);
            buttons[i].setId(uniqueIds[i]);

            panel.add(buttons[i]);
            buttons[i].addActionListener(this);

        }
    }
    catch (Exception e2){
        JOptionPane.showMessageDialog(null, e2);
    }

    frame.add(panel);
    frame.setVisible(true);
    frame.setSize(500, 500);

}

public void actionPerformed(ActionEvent e) {

    for (int j = 0; j < buttons.length; j ++){
        if (e.getSource() == buttons[j]){
            AdminStatus sc = new AdminStatus(buttons[j].getId());
            frame.dispose();
        }
    }

    if (e.getSource() == btnNewButton){

        frame.dispose();
        WindowProjectAdmin wpa = new WindowProjectAdmin();

    }

}

//Method to convert integar array list to integar array
public int[] convertIntegers(List<Integer> integers)
    {
        int[] ret = new int[integers.size()];
        for (int i=0; i < ret.length; i++)
        {
            ret[i] = integers.get(i).intValue();
        }
        return ret;
    }

}
这可能看起来很正常,但事实并非如此,因为某些原因,它们不可见或在滚动条中不被调用。也许请编辑我的代码

我只希望按钮部分在J滚动窗格内

如果您只想在循环中添加JButton的按钮:

创建添加按钮的新JPanel 将1添加到JScrollPane 将2添加到面板 例如:

JPanel buttonPanel = new JPanel(new FlowLayout());
for (int i = 0; i < projectNames.length; i++){
    buttons[i] = new ProjectButton(projectNames[i]);
    buttons[i].setId(uniqueIds[i]);
    panel.add(buttons[i]);
    buttonPanel[i].addActionListener(this);
}
JScrollPane scroller = new JScrollPane(buttonPanel);
panel.add(scroller);

您也可以考虑使用一个不需要JSCROLBOANE的不同组件,当然取决于您的需求,例如A.p> 我只希望按钮部分在J滚动窗格内

如果您只想在循环中添加JButton的按钮:

创建添加按钮的新JPanel 将1添加到JScrollPane 将2添加到面板 例如:

JPanel buttonPanel = new JPanel(new FlowLayout());
for (int i = 0; i < projectNames.length; i++){
    buttons[i] = new ProjectButton(projectNames[i]);
    buttons[i].setId(uniqueIds[i]);
    panel.add(buttons[i]);
    buttonPanel[i].addActionListener(this);
}
JScrollPane scroller = new JScrollPane(buttonPanel);
panel.add(scroller);

您也可以考虑使用一个不需要JSCROLBOANE的不同组件,当然取决于您的需求,例如A.p> 首先将按钮添加到它们自己的容器中,这样您就可以独立于UI的其余部分来控制按钮的布局

    JPanel panelFullOfButtons = new JPanel();
    try {
        for (int i = 0; i < projectNames.length; i++) {
            buttons[i] = new ProjectButton(projectNames[i]);
            buttons[i].setId(uniqueIds[i]);

            panelFullOfButtons.add(buttons[i]);
            buttons[i].addActionListener(this);

        }
    } catch (Exception e2) {
        JOptionPane.showMessageDialog(null, e2);
    }
请注意,在这种情况下,我很想改用JList之类的东西。有关更多详细信息,请参阅

我也这么做了,你能告诉我怎么了吗

它们相互竞争,移动内容并与现有内容重叠

public AdminClass() {

    panel.setLayout(new GridLayout(3, 1));

    panel.add(new JLabel("Welcome to Admin Panel"));

    btnNewButton.addActionListener(this);
    panel.add(btnNewButton);

    panel.add(new JLabel("Existing Projects"));

    List<String> projectNameList = new ArrayList<String>();
    for (int index = 0; index < 1000; index++) {
        projectNameList.add("Project " + index);
    }
    projectNames = projectNameList.toArray(new String[0]);

    // Adding buttons to the project
    buttons = new JButton[projectNameList.size()];
    try {
        for (int i = 0; i < projectNames.length; i++) {
            buttons[i] = new JButton(projectNames[i]);

            btnPnl1.add(buttons[i]);
            buttons[i].addActionListener(this);

        }
    } catch (Exception e2) {
        JOptionPane.showMessageDialog(null, e2);
    }

    frame.add(panel, BorderLayout.NORTH);
    frame.add(new JScrollPane(btnPnl1), BorderLayout.CENTER);

    frame.setVisible(true);
    frame.setSize(500, 500);

}

在这种情况下,我更喜欢使用JList来显示项目,或者使用JList来布置按钮

首先将按钮添加到它们自己的容器中,这样您就可以独立于UI的其余部分来控制按钮的布局

    JPanel panelFullOfButtons = new JPanel();
    try {
        for (int i = 0; i < projectNames.length; i++) {
            buttons[i] = new ProjectButton(projectNames[i]);
            buttons[i].setId(uniqueIds[i]);

            panelFullOfButtons.add(buttons[i]);
            buttons[i].addActionListener(this);

        }
    } catch (Exception e2) {
        JOptionPane.showMessageDialog(null, e2);
    }
请注意,在这种情况下,我很想改用JList之类的东西。有关更多详细信息,请参阅

我也这么做了,你能告诉我怎么了吗

它们相互竞争,移动内容并与现有内容重叠

public AdminClass() {

    panel.setLayout(new GridLayout(3, 1));

    panel.add(new JLabel("Welcome to Admin Panel"));

    btnNewButton.addActionListener(this);
    panel.add(btnNewButton);

    panel.add(new JLabel("Existing Projects"));

    List<String> projectNameList = new ArrayList<String>();
    for (int index = 0; index < 1000; index++) {
        projectNameList.add("Project " + index);
    }
    projectNames = projectNameList.toArray(new String[0]);

    // Adding buttons to the project
    buttons = new JButton[projectNameList.size()];
    try {
        for (int i = 0; i < projectNames.length; i++) {
            buttons[i] = new JButton(projectNames[i]);

            btnPnl1.add(buttons[i]);
            buttons[i].addActionListener(this);

        }
    } catch (Exception e2) {
        JOptionPane.showMessageDialog(null, e2);
    }

    frame.add(panel, BorderLayout.NORTH);
    frame.add(new JScrollPane(btnPnl1), BorderLayout.CENTER);

    frame.setVisible(true);
    frame.setSize(500, 500);

}
在这种情况下,我更喜欢使用JList来显示项目,或者使用a来布置按钮

这样创建网格布局是没有用的:panel.setLayoutnew GridLayout10,1;。如果将行声明为非零值,则将忽略列计数。当您将最大行数声明为10时,将强制在第二列中添加第十一个组件,然后添加第三个、第四个,依此类推。使用panel.setLayoutnew GridLayout0,1;而是强制只使用一个列和frame.addnew JScrollPanepanel;创建滚动窗格

但请注意,GridLayout将尝试在启用滚动之前最大限度地缩小组件以适应容器大小。

创建这样的GridLayout是没有用的:panel.setLayoutnew GridLayout10,1;。如果将行声明为非零值,则将忽略列计数。当您将最大行数声明为10时,将强制在第二列中添加第十一个组件,然后添加第三个、第四个,依此类推。使用panel.setLayoutnew GridLayout0,1;而是强制只使用一个列和frame.addnew JScrollPanepanel;创建滚动窗格


但请注意,GridLayout将尝试在启用滚动之前最大限度地缩小组件以适应容器大小。

frame.addnew JScrollPanepanel;?这就是我想说的,并不像看上去那么简单。如果运行代码,您就会知道。我只希望按钮部分在J滚动窗格中。如果您运行我们无法运行的代码,您就会知道,这就是为什么我们通常要求一个。那么?将按钮移动到一个单独的JPanel将两个面板添加到框架中,第一个面板添加到BorderLayout.NORTH,第二个面板包装在一个JScrollPane中,添加到BorderLayout.CENTER位置……我的第一个建议会起作用,但由于您尚未阐明希望UI看起来如何,我们只能猜测itframe.addnew JScrollPanepanel;?这就是我想说的,并不像看上去那么简单。如果运行代码,您就会知道。我只希望按钮部分在J滚动窗格中。如果您运行我们无法运行的代码,您就会知道,这就是为什么我们通常要求一个。那么?将按钮移动到单独的JPanel将两个面板添加到框架中,第一个面板添加到BorderLayout.NORTH,第二个面板包装在JScrollPane中,添加到BorderLayout.CENTER位置…我的第一个建议会起作用,但由于您尚未阐明希望UI的外观,我们只能猜测它没有起作用,按钮仍然没有生成。你能编辑我的代码吗?@SkibRs怎么会不成功?什么是按钮仍然没有繁殖?没有工作,兄弟,按钮仍然没有繁殖。你能编辑我的代码吗?@SkibRs怎么会不成功?按钮仍然不能生成意味着什么?我有唐 同样,你能告诉我怎么了吗?仍然不起作用。检查布局?滚动窗格突出,里面没有按钮。我也这么做了,你能告诉我怎么了吗?仍然不起作用。检查布局?滚动窗格突出,里面没有按钮。