我创建了一个聊天面板并添加到Jframe,但面板未显示。但我在聊天面板中的表现正在控制台中显示。任何人请让我知道可能是什么问题
我的框架
public class MyFrame extends JFrame {
MyPanel chatClient;
String input;
public MyFrame() {
input = (String)JOptionPane.showInputDialog(null, "Name:", "Connect to chat
server", JOptionPane.QUESTION_MESSAGE, null,null, "Test");
input=input.trim();
chatClient = new MyPanel("localhost",input);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
add(chatClient);
}
public static void main(String...args){
new MyFrame();
}
}
MyPanel:
public class MyPanel extends JPanel{
ChatClient chatClient;
public MyPanel(String host, String uid) {
chatClient= new ChatClient(host,uid);
add(chatClient.getChatPanel());
this.setVisible(true);
}
}
聊天面板:
public class ChatClient {
Client client;
String name;
ChatPanel chatPanel;
String hostid;
public ChatClient(String host,String uid){
client = new Client();
client.start();
System.out.println("in constructor");
Network.register(client);
client.addListener(new Listener(){
public void connected(Connection connection){
System.out.println("in client connected method");
Network.RegisterName registerName = new Network.RegisterName();
registerName.name=name;
client.sendTCP(registerName);
}
public void received(Connection connection,Object object){
System.out.println("in client received method");
if (object instanceof Network.UpdateNames) {
Network.UpdateNames updateNames = (Network.UpdateNames)object;
//chatFrame.setNames(updateNames.names);
System.out.println("got it message");
return;
}
if (object instanceof Network.ChatMessage) {
Network.ChatMessage chatMessage = (Network.ChatMessage)object;
//chatFrame.addMessage(chatMessage.text);
System.out.println("send it message");
return;
}
}
}); // end of listner
name=uid.trim();
hostid=host.trim();
chatPanel = new ChatPanel(hostid,name);
chatPanel.setSendListener(new Runnable(){
public void run(){
Network.ChatMessage chatMessage = new Network.ChatMessage();
chatMessage.chatMessage=chatPanel.getSendText();
client.sendTCP(chatMessage);
}
});
new Thread("connect"){
public void run(){
try{
client.connect(5000, hostid,Network.port);
}catch(IOException e){
e.printStackTrace();
}
}
}.start();
}//end of constructor
static public class ChatPanel extends JPanel{
CardLayout cardLayout;
JList messageList,nameList;
JTextField sendText;
JButton sendButton;
JPanel topPanel,bottomPanel,panel;
public ChatPanel(String host,String user){
setSize(600, 200);
this.setVisible(true);
System.out.println("Chat panel "+host+"user: "+user);
{
panel = new JPanel(new BorderLayout());
{
topPanel = new JPanel(new GridLayout(1,2));
panel.add(topPanel);
{
topPanel.add(new JScrollPane(messageList=new JList()));
messageList.setModel(new DefaultListModel());
}
{
topPanel.add(new JScrollPane(nameList=new JList()));
nameList.setModel(new DefaultListModel());
}
DefaultListSelectionModel disableSelections = new DefaultListSelectionModel() {
public void setSelectionInterval (int index0, int index1) {
}
};
messageList.setSelectionModel(disableSelections);
nameList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
}
{
bottomPanel = new JPanel(new GridBagLayout());
panel.add(bottomPanel,BorderLayout.SOUTH);
bottomPanel.add(sendText=new JTextField(),new GridBagConstraints(0,0,1,1,1,0,GridBagConstraints.CENTER,GridBagConstraints.BOTH,new Insets(0,0,0,0),0,0));
bottomPanel.add(sendButton=new JButton(),new GridBagConstraints(1,0,1,1,0,0,GridBagConstraints.CENTER,0,new Insets(0,0,0,0),0,0));
}
}
sendText.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
sendButton.doClick();
}
});
}
public void setSendListener (final Runnable listener) {
sendButton.addActionListener(new ActionListener() {
public void actionPerformed (ActionEvent evt) {
if (getSendText().length() == 0) return;
listener.run();
sendText.setText("");
sendText.requestFocus();
}
});
}
public String getSendText () {
return sendText.getText().trim();
}
public void setNames (final String[] names) {
EventQueue.invokeLater(new Runnable(){
public void run(){
DefaultListModel model = (DefaultListModel)nameList.getModel();
model.removeAllElements();
for(String name:names)
model.addElement(name);
}
});
}
public void addMessage (final String message) {
EventQueue.invokeLater(new Runnable() {
public void run () {
DefaultListModel model = (DefaultListModel)messageList.getModel();
model.addElement(message);
messageList.ensureIndexIsVisible(model.size() - 1);
}
});
}
}
public JPanel getChatPanel(){
return chatPanel;
}
}
public class ChatPanel {
ChatP caht;
public ChatPanel1() {
caht=new ChatP();
}
static class ChatP extends JPanel{
JPanel panel;
public ChatP(){
panel = new JPanel();
panel.add(new JLabel("hi from chat panel"));
}
}
public JPanel getChatPanel(){
return caht;
}
}
答案 0 :(得分:4)
致电pack()
。拼凑在一起的代码仍然存在许多问题,而且有些奇怪的方面,但显示..
import java.awt.*;
import javax.swing.*;
public class MyFrame extends JFrame {
MyPanel chatClient;
String input;
public MyFrame() {
chatClient = new MyPanel("localhost","input");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
add(chatClient);
pack();
// Do last!
setVisible(true);
}
public static void main(String...args){
new MyFrame();
}
}
class MyPanel extends JPanel{
public MyPanel(String host, String uid) {
ChatPanel chatPanel = new ChatPanel();
add(chatPanel.getChatPanel());
}
}
class ChatPanel {
ChatP caht;
public ChatPanel() {
caht=new ChatP();
}
static class ChatP extends JPanel{
public ChatP(){
add(new JLabel("hi from chat panel"));
}
}
public JPanel getChatPanel(){
return caht;
}
}
不包括电池。该来源是诊断问题并提出解决方案所需的极简主义代码。为了更好地提供帮助,请发布SSCCE。
答案 1 :(得分:2)
setVisible(true)
(在您的框架上)应该是您的最后一行,或者在向框架添加组件后,您必须在框架内容窗格上调用revalidate()
。
答案 2 :(得分:2)
几乎就在那里。你反过来就得到了这段代码。
setVisible(true);
add(chatClient);
应该是:
add(chatClient);
pack();
setVisible(true);
另外,请注意pack()
的来电,以确保您的相框已准备好可见。