我的 Java 程序中的 JList 正在占用整个 JPanel! 我该怎么办?
package infoKupProcess;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;
class TCPServer extends JFrame {
public static String processes = "none";
static String processesList[] = processes.split(":");
private static int screenWidth = 800, screenHeight = 600;
static JButton quitButton;
static JScrollPane procScroll;
static ServerSocket inSocket;
private static boolean running = false;
private static JList procList;
public TCPServer() {
initUI();
}
public void initUI() {
JPanel panel = new JPanel();
getContentPane().add(panel);
panel.setLayout(new BorderLayout());
setSize(800, 600);
// {
// String listData[] = { "Item 1", "Item 2", "Item 3", "Item 4" };
//
// // Create a new listbox control
// procList = new JList(listData);
// panel.add(procList, BorderLayout.CENTER);
// }
{
quitButton = new JButton("Ugasi");
quitButton.setBounds(705, 533, 80, 30);
quitButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent event) {
running = false;
try {
inSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
System.exit(0);
}
});
panel.add(quitButton);
}
// setTitle("TCPServer");
// setSize(screenWidth, screenHeight);
// setLocationRelativeTo(null);
// setDefaultCloseOperation(EXIT_ON_CLOSE);
// Set the frame characteristics
procList = new JList();
procList.setListData(processesList);
procScroll = new JScrollPane(procList);
panel.add(procScroll);
}
public static void main(String argv[]) throws Exception {
running = true;
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
TCPServer ex = new TCPServer();
ex.setVisible(true);
}
});
processProcesses();
}
public static void processProcesses() throws Exception {
String clientSentence, capitalizedSentence;
inSocket = new ServerSocket(25565);
while (running) {
Socket connectionSocket = inSocket.accept();
BufferedReader inFromClient = new BufferedReader(
new InputStreamReader(connectionSocket.getInputStream()));
clientSentence = inFromClient.readLine();
processes = clientSentence;
processesList=processes.split(":");
procList.setListData(processesList);
DataOutputStream outToClient = new DataOutputStream(
connectionSocket.getOutputStream());
capitalizedSentence = clientSentence.toUpperCase() + '\n';
outToClient.writeBytes(capitalizedSentence);
}
}
}
最佳答案
您正在使用 JPanel 的默认 BorderLayout.CENTER 位置将列表的 JScrollPane 添加到 BorderLayout。所以它将填充 JPanel。解决方案:使用其他布局,或者更好的是,将使用 JPanel 的 BorderLayout 放在另一个使用合适布局的 JPanel 中。
顺便说一句,其他问题:
- 您的代码显示了对 static 修饰符的严重过度使用和误用,事实上,您的大部分字段和方法不应该是静态的。
- 您不应设置大小、首选大小、位置或任何内容的边界。让组件、容器和布局管理器发挥它们的魔力并设置 GUI 的大小。
- 这可以通过在将 JFrame 设置为可见之前调用
pack()
来完成。
关于java - 我的 JList 占满了整个屏幕,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21223055/