Java图形添加方法
Java graphics add method
我正在尝试创建一个网络扑克服务器客户端程序,我目前正在编写包括图形部分的客户端,但是当我尝试在特定条件下向我的代码中的 JPanel 添加一个组件时在运行方法中遇到,add方法似乎不起作用,但是在相同条件下操作JPanel的其他方法有效。
public class PokerClient {
BufferedReader in;
PrintWriter out;
JFrame frame = new JFrame("Poker");
JPanel playerHandPanel;
String serverAddress = "localhost";
String playerName;
Card playerHand1, playerHand2;
public PokerClient() {
// Layout GUI
frame.setSize(1100, 700);
frame.setResizable(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
playerHandPanel = new JPanel(new GridLayout(1, 2));
playerHandPanel.setPreferredSize(new Dimension(600, 300));
playerHandPanel.add(new CardComponent(new Card(3, Suit.CLUB))); //it works here
playerHandPanel.setVisible(true);
frame.add(playerHandPanel, BorderLayout.NORTH);
frame.setVisible(true);
}
/**
* Prompt for and return the desired screen name.
*/
private String getName() {
return JOptionPane.showInputDialog(
frame,
"Choose a screen name:",
"Screen name selection",
JOptionPane.PLAIN_MESSAGE);
}
private Card constructCard(String line){
int seperator = line.indexOf('/');
int cardNum = Integer.parseInt(line.substring(0, seperator));
Card card;
if(line.substring(seperator+1).startsWith("S")){
card = new Card(cardNum, Suit.SPADE);
} else if(line.substring(seperator+1).startsWith("C")){
card = new Card(cardNum, Suit.CLUB);
} else if(line.substring(seperator+1).startsWith("D")){
card = new Card(cardNum, Suit.DIAMOND);
} else{
card = new Card(cardNum, Suit.HEART);
}
System.out.println(card.toString());
return card;
}
/**
* Connects to the server then enters the processing loop.
*/
private void run() throws IOException {
Socket socket = new Socket(serverAddress, 9050);
in = new BufferedReader(new InputStreamReader(
socket.getInputStream()));
out = new PrintWriter(socket.getOutputStream(), true);
// Process all messages from server, according to the protocol.
while (true) {
String line = in.readLine();
System.out.println(line);
if (line.startsWith("SUBMITNAME")) {
// String name = getName();
// playerName = name;
// out.println(name);
} else if (line.startsWith("p1")) {
playerHandPanel.add(new CardComponent(new Card(4, Suit.SPADE)));//this doesn't work i can't figure out why
playerHandPanel.setBackground(Color.WHITE);//this worked
playerHandPanel.add(new JLabel("is this added"));//this doesn't work either
playerHandPanel.repaint();
}
}
}
public static void main(String[] args) throws Exception {
PokerClient client = new PokerClient();
client.frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
client.frame.setVisible(true);
client.run();
}
}
几个问题跳出来:
- 您在添加或删除组件后没有在 playerHandPanel 上调用
revalidate()
-- 可能是您问题的主要原因。
- 您人为地限制了 playerHandPanel 的大小
- 并且不将其放入 JScrollPane
- 您的代码通过从 Swing 事件线程或 EDT 更改主要 Swing 组件状态来炫耀 Swing 线程规则
- 您正在使用约束布局,
new GridLayout(1, 2)
可能的解决方案:
- 是的,请在添加或删除组件后在 playerHandPanel 上调用
revalidate()
。这将告诉它的布局管理器做他们的事情。
- 如果要使用 GridLayout,请以更灵活的方式进行,例如
new GridLayout(1, 0)
或 new GridLayout(1, 0)
,具体取决于您是要指定列数还是行数( 0
表示可变数量的列或行)
- 考虑使用 JList 或 JTable,这两个组件更容易添加内容。
- 学习并遵循 Swing 线程规则,包括仅在 Swing 事件线程上进行 Swing 状态更改(例如添加或删除组件、更改背景颜色...)。
我正在尝试创建一个网络扑克服务器客户端程序,我目前正在编写包括图形部分的客户端,但是当我尝试在特定条件下向我的代码中的 JPanel 添加一个组件时在运行方法中遇到,add方法似乎不起作用,但是在相同条件下操作JPanel的其他方法有效。
public class PokerClient {
BufferedReader in;
PrintWriter out;
JFrame frame = new JFrame("Poker");
JPanel playerHandPanel;
String serverAddress = "localhost";
String playerName;
Card playerHand1, playerHand2;
public PokerClient() {
// Layout GUI
frame.setSize(1100, 700);
frame.setResizable(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
playerHandPanel = new JPanel(new GridLayout(1, 2));
playerHandPanel.setPreferredSize(new Dimension(600, 300));
playerHandPanel.add(new CardComponent(new Card(3, Suit.CLUB))); //it works here
playerHandPanel.setVisible(true);
frame.add(playerHandPanel, BorderLayout.NORTH);
frame.setVisible(true);
}
/**
* Prompt for and return the desired screen name.
*/
private String getName() {
return JOptionPane.showInputDialog(
frame,
"Choose a screen name:",
"Screen name selection",
JOptionPane.PLAIN_MESSAGE);
}
private Card constructCard(String line){
int seperator = line.indexOf('/');
int cardNum = Integer.parseInt(line.substring(0, seperator));
Card card;
if(line.substring(seperator+1).startsWith("S")){
card = new Card(cardNum, Suit.SPADE);
} else if(line.substring(seperator+1).startsWith("C")){
card = new Card(cardNum, Suit.CLUB);
} else if(line.substring(seperator+1).startsWith("D")){
card = new Card(cardNum, Suit.DIAMOND);
} else{
card = new Card(cardNum, Suit.HEART);
}
System.out.println(card.toString());
return card;
}
/**
* Connects to the server then enters the processing loop.
*/
private void run() throws IOException {
Socket socket = new Socket(serverAddress, 9050);
in = new BufferedReader(new InputStreamReader(
socket.getInputStream()));
out = new PrintWriter(socket.getOutputStream(), true);
// Process all messages from server, according to the protocol.
while (true) {
String line = in.readLine();
System.out.println(line);
if (line.startsWith("SUBMITNAME")) {
// String name = getName();
// playerName = name;
// out.println(name);
} else if (line.startsWith("p1")) {
playerHandPanel.add(new CardComponent(new Card(4, Suit.SPADE)));//this doesn't work i can't figure out why
playerHandPanel.setBackground(Color.WHITE);//this worked
playerHandPanel.add(new JLabel("is this added"));//this doesn't work either
playerHandPanel.repaint();
}
}
}
public static void main(String[] args) throws Exception {
PokerClient client = new PokerClient();
client.frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
client.frame.setVisible(true);
client.run();
}
}
几个问题跳出来:
- 您在添加或删除组件后没有在 playerHandPanel 上调用
revalidate()
-- 可能是您问题的主要原因。 - 您人为地限制了 playerHandPanel 的大小
- 并且不将其放入 JScrollPane
- 您的代码通过从 Swing 事件线程或 EDT 更改主要 Swing 组件状态来炫耀 Swing 线程规则
- 您正在使用约束布局,
new GridLayout(1, 2)
可能的解决方案:
- 是的,请在添加或删除组件后在 playerHandPanel 上调用
revalidate()
。这将告诉它的布局管理器做他们的事情。 - 如果要使用 GridLayout,请以更灵活的方式进行,例如
new GridLayout(1, 0)
或new GridLayout(1, 0)
,具体取决于您是要指定列数还是行数(0
表示可变数量的列或行) - 考虑使用 JList 或 JTable,这两个组件更容易添加内容。
- 学习并遵循 Swing 线程规则,包括仅在 Swing 事件线程上进行 Swing 状态更改(例如添加或删除组件、更改背景颜色...)。