Java 图形用户界面不';当我将JinternalFrame与服务器套接字应用程序结合使用时,将不再显示
我有一个客户机/服务器应用程序工作得很好。现在,我刚刚查看了oracle网站上的JInternalFrames,并考虑将我的Socket Server应用程序与JInternalFrames相结合,以便生成一个框架,在其文本区域中显示来自客户端的每个传入消息。只有一个客户端。 现在我的问题是: 1) InternalFrames的GUI不再显示,但我可以看到套接字线程正在运行。 2) 是否有人知道或者有任何文章可以让我深入了解如何动态创建新框架来显示来自客户端的每条传入消息?它是一个单客户端/单服务器应用程序 这是我的密码Java 图形用户界面不';当我将JinternalFrame与服务器套接字应用程序结合使用时,将不再显示,java,sockets,Java,Sockets,我有一个客户机/服务器应用程序工作得很好。现在,我刚刚查看了oracle网站上的JInternalFrames,并考虑将我的Socket Server应用程序与JInternalFrames相结合,以便生成一个框架,在其文本区域中显示来自客户端的每个传入消息。只有一个客户端。 现在我的问题是: 1) InternalFrames的GUI不再显示,但我可以看到套接字线程正在运行。 2) 是否有人知道或者有任何文章可以让我深入了解如何动态创建新框架来显示来自客户端的每条传入消息?它是一个单客户端/单
public class InternalFrameDemo extends JFrame
implements ActionListener {
private static ServerSocket serverSocket;
private static Socket clientSocket;
private static InputStreamReader inputStreamReader;
private static BufferedReader bufferedReader;
private static String message;
JDesktopPane desktop;
public InternalFrameDemo() {
super("InternalFrameDemo");
//Make the big window be indented 50 pixels from each edge
//of the screen.
int inset = 50;
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
setBounds(inset, inset,
screenSize.width - inset*2,
screenSize.height - inset*2);
//Set up the GUI.
desktop = new JDesktopPane(); //a specialized layered pane
createFrame(); //create first "window"
setContentPane(desktop);
setJMenuBar(createMenuBar());
//Make dragging a little faster but perhaps uglier.
desktop.setDragMode(JDesktopPane.OUTLINE_DRAG_MODE);
}
protected JMenuBar createMenuBar() {
JMenuBar menuBar = new JMenuBar();
//Set up the lone menu.
JMenu menu = new JMenu("Document");
menu.setMnemonic(KeyEvent.VK_D);
menuBar.add(menu);
//Set up the first menu item.
JMenuItem menuItem = new JMenuItem("New");
menuItem.setMnemonic(KeyEvent.VK_N);
menuItem.setAccelerator(KeyStroke.getKeyStroke(
KeyEvent.VK_N, ActionEvent.ALT_MASK));
menuItem.setActionCommand("new");
menuItem.addActionListener(this);
menu.add(menuItem);
//Set up the second menu item.
menuItem = new JMenuItem("Quit");
menuItem.setMnemonic(KeyEvent.VK_Q);
menuItem.setAccelerator(KeyStroke.getKeyStroke(
KeyEvent.VK_Q, ActionEvent.ALT_MASK));
menuItem.setActionCommand("quit");
menuItem.addActionListener(this);
menu.add(menuItem);
return menuBar;
}
//React to menu selections.
public void actionPerformed(ActionEvent e) {
if ("new".equals(e.getActionCommand())) { //new
createFrame();
} else { //quit
quit();
}
}
//Create a new internal frame.
protected void createFrame() {
MyInternalFrame frame = new MyInternalFrame();
// JFrame frame = new JFrame();
JButton b1 = new JButton("Print");
JTextArea area = new JTextArea();
area.setText("This is a simple area text ");
area.setPreferredSize(new Dimension(100,100));
frame.getContentPane().add(new JScrollPane(area), BorderLayout.CENTER);
JPanel buttonPane = new JPanel();
buttonPane.add(b1);
b1.setMnemonic(KeyEvent.VK_D);
b1.setActionCommand("quit");
b1.addActionListener(this);
frame.add(buttonPane, BorderLayout.SOUTH);
frame.setVisible(true); //necessary as of 1.3
desktop.add(frame);
try {
frame.setSelected(true);
} catch (java.beans.PropertyVetoException e) {}
//socket connection
StringBuilder everything = new StringBuilder();
try {
serverSocket = new ServerSocket(0007); // Server socket
System.out.println("server started listening on port:0007");
} catch (IOException e) {
System.out.println("Could not listen on port: 5000");
}
while (true) {
try {
clientSocket = serverSocket.accept(); // accept the client connection
inputStreamReader = new InputStreamReader(clientSocket.getInputStream());
bufferedReader = new BufferedReader(inputStreamReader); // get the client message
//message = bufferedReader.readLine();
// while(message != null)
while( (message = bufferedReader.readLine()) != null) {
everything.append(message+"\n");
}
area.setText(everything.toString());
inputStreamReader.close();
clientSocket.close();
} catch (IOException ex) {
System.out.println("Problem in message reading");
}
}
}
//Quit the application.
protected void quit() {
System.exit(0);
}
/**
* Create the GUI and show it. For thread safety,
* this method should be invoked from the
* event-dispatching thread.
*/
private static void createAndShowGUI() {
//Make sure we have nice window decorations.
JFrame.setDefaultLookAndFeelDecorated(true);
//Create and set up the window.
InternalFrameDemo frame = new InternalFrameDemo();
//Display the window.
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
//Schedule a job for the event-dispatching thread:
//creating and showing this application's GUI.
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
}
/////////////////////////////////
public class MyInternalFrame extends JInternalFrame {
static int openFrameCount = 0;
static final int xOffset = 30, yOffset = 30;
public MyInternalFrame() {
super("Document #" + (++openFrameCount),
true, //resizable
true, //closable
true, //maximizable
true);//iconifiable
//...Create the GUI and put it in the window...
//...Then set the window size or call pack...
setSize(300,300);
//Set the window's location.
setLocation(xOffset*openFrameCount, yOffset*openFrameCount);
}
}
我将非常感谢您的任何帮助…谢谢您看来您正在阻止接听
电话。这很容易检查-使用jps
查找流程id(pid),然后使用jstack
(或类似)。您需要在不同的线程上运行阻塞网络代码
(关于代码的标准建议:不要使用静态[mutable]变量。不要扩展不需要的类。为每个操作使用单独的侦听器类。使用try with resource确保释放资源。)我恐怕不能投票支持Tom的答案(分数不够等),但他是正确的。您的accept方法正在阻止该线程,并且您正在同一线程中启动UI。您必须同意,更改代码,使UI线程尽可能与网络线程解耦。感谢您的努力,我已经理解了您的建议。但我该怎么做呢。如何将UI线程与网络线程解耦?请看一看MVC设计模式,你的用户界面应该就是你的用户界面,它不需要了解任何关于你的客户端的信息,也不需要任何客户端(我在这里指的是客户端-服务器代码)代码,它所需要做的就是公开一些方法,允许你在屏幕上显示任何内容。看看@MadProgrammer…你真的是一个MadProgrammer。现在我已经让应用程序运行并显示GUI。我唯一的问题是动态创建一个新的内部框架来显示来自客户端的每条消息。你有什么建议吗文章或建议,以帮助我完成这最后一关???…再次感谢你