java中如何在jframe标题栏中添加按钮
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中如何在jframe标题栏中添加按钮相关的知识,希望对你有一定的参考价值。
参考技术A 首先我们来看一下如何让窗口(比如说JFrame)的标题栏不显示呢?其实很简单,只需要调用Frame类中的setUndecorated()方法就可以让Frame窗口失去边框和标题栏的修饰了。代码示例如下: JFrame f = new JFrame(test frame); f.setUndecorated(true); f.setSize(300, 300); f.setVisible(true); 运行如上程序,您将会发现一个没有任何边框和标题栏的窗口显示在界面上了。但是这里需要注意的是,setUndecroated方法必须在 setVisible之前被执行,一定要确保Frame窗口是新创建并且没有做过任何显示,甚至是pack动作也不能做过,否则你会得到一个异常。 好了,完成一个任务之后,我们继续来讲述如何让窗口全屏幕显示,这个问题的解决思路非常简单,只要我 ...本回答被提问者采纳Java - 使用 AWT 更改 JFrame 的标题
【中文标题】Java - 使用 AWT 更改 JFrame 的标题【英文标题】:Java - Using AWT to change title of JFrame 【发布时间】:2020-11-16 15:59:30 【问题描述】:我正在编写一个简单的多线程客户端/服务器聊天系统。项目要求指定:“连接仅在单击连接按钮时发生。断开连接按钮应断开连接。用户在按下连接按钮之前输入用户名,一旦如上检索到用户名,还应将其添加到标题栏框架。”基本上,我已经连接并运行了连接按钮。当用户输入他的名字并按下 Connect 时,我如何更改主框架的标题。请帮忙,这是我的第一个套接字编程项目,我对这个超级难过!谢谢大家。
客户:
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
import java.util.ArrayList;
public class ClientFrame extends Frame
public ClientFrame()
setSize(500, 500);
setTitle("Chat Client");
addWindowListener(new WindowAdapter()
public void windowClosing(WindowEvent We)
System.exit(0);
);
add(new ClientPanel(), BorderLayout.CENTER);
setVisible(true);
public static void main(String[] args)
new ClientFrame();
// end ClientFrame
class ClientPanel extends Panel implements ActionListener, Runnable
TextField tf;
TextArea ta;
List list;
Button connect, disconnect;
Socket socketToServer;
PrintWriter pw;
BufferedReader br;
Thread t;
String userName;
public ClientPanel()
setLayout(new BorderLayout());
tf = new TextField();
ta = new TextArea();
list = new List();
connect = new Button("Connect");
disconnect = new Button("Disconnect");
Panel bPanel = new Panel();
bPanel.add(connect);
disconnect.setEnabled(false);
bPanel.add(disconnect);
tf.addActionListener(this);
add(tf, BorderLayout.NORTH);
add(ta, BorderLayout.CENTER);
add(list, BorderLayout.EAST);
add(bPanel, BorderLayout.SOUTH);
connect.addActionListener(this);
disconnect.addActionListener(this);
// end ClientPanel constructor
public void actionPerformed(ActionEvent ae)
if (ae.getSource() == tf)
System.out.println(tf + " " + tf.getText());
String temp = tf.getText();
pw.println(userName + ": " + temp);
tf.setText("");
else if (ae.getSource() == connect)
if (tf.getText() == null || tf.getText().equals(""))
ta.append("Must enter a name to connect\n");
else
userName = tf.getText();
connect.setEnabled(false);
disconnect.setEnabled(true);
tf.setText("");
try
socketToServer = new Socket("127.0.0.1", 3000);
pw = new PrintWriter(new OutputStreamWriter(socketToServer.getOutputStream()), true);
br = new BufferedReader(new InputStreamReader(socketToServer.getInputStream()));
catch (UnknownHostException uhe)
System.out.println(uhe.getMessage());
catch (IOException ioe)
System.out.println(ioe.getMessage());
t = new Thread(this);
t.start();
pw.println(userName);
pw.println(userName + " has entered the chat.");
else if (ae.getSource() == disconnect)
connect.setEnabled(true);
disconnect.setEnabled(false);
try
tf.setText("");
try
socketToServer = new Socket("127.0.0.1", 3000);
pw = new PrintWriter(new OutputStreamWriter(socketToServer.getOutputStream()), true);
br = new BufferedReader(new InputStreamReader(socketToServer.getInputStream()));
catch (UnknownHostException uhe)
System.out.println(uhe.getMessage());
catch (IOException ioe)
System.out.println(ioe.getMessage());
t = new Thread(this);
t.start();
pw.println(userName);
pw.println(userName + " has Disconnected the chat.");
t.interrupt();
socketToServer.close();
catch (IOException ioe)
System.out.println(ioe.getMessage());
// end actionPerformed
public void run()
try
for (;;)
try
String temp = br.readLine();
ta.append(temp + "\n");
catch (IOException ioe)
System.out.println(ioe.getMessage());
Thread.sleep(10);
catch (InterruptedException e)
pw.println("Disconnected.");
// end run
// end ClientPanel
服务器:
import java.io.*;
import java.net.*;
import java.util.ArrayList;
import java.awt.*;
public class ThreadedServerWithPresence
public static void main(String[] args)
ArrayList<ThreadedHandlerWithPresence> handlers;
try
handlers = new ArrayList<ThreadedHandlerWithPresence>();
ServerSocket s = new ServerSocket(3000);
for (;;)
Socket incoming = s.accept();
new ThreadedHandlerWithPresence(incoming,
handlers).start();
catch (Exception e)
System.out.println(e);
class ThreadedHandlerWithPresence extends Thread
Socket incoming;
ArrayList<ThreadedHandlerWithPresence> handlers;
PrintWriter pw;
BufferedReader br;
String userName;
public ThreadedHandlerWithPresence(Socket i,
ArrayList<ThreadedHandlerWithPresence> handlers)
incoming = i;
this.handlers = handlers;
handlers.add(this);
public void setUserName(String userName)
this.userName = userName;
public String getUserName()
return userName;
public void run()
try
br = new BufferedReader(new InputStreamReader(incoming.getInputStream()));
pw = new PrintWriter(new OutputStreamWriter(incoming.getOutputStream()), true);
String firstLine = br.readLine();
setUserName(firstLine);
for (;;)
String temp = br.readLine();
if (temp == null)
break;
System.out.println("Message read: " + temp);
for (int i = 0; i < handlers.size(); i++)
handlers.get(i).pw.println(temp);
catch (Exception e)
System.out.println(e);
finally
handlers.remove(this);
【问题讨论】:
【参考方案1】:这很简单。如果您将类扩展为 Frame,您只需将 ClientFrame 类传递给 ClientPanel,如下所示:
add(new ClientPanel(this), BorderLayout.CENTER);
在 ClientPanle 构造函数中,您可以执行以下操作:
JFrame clientFrame;
public ClientPanel(JFrame clientFrame)
this.clientFrame=clientFrame;
最后你调用了想要的方法:
clientFrame.setTitle(userName);
【讨论】:
我在 ClientFrame 中没有“用户名”。 'username' 仅在建立连接后设置,现在如何在 ClientPanel 中设置 Title ... 哦,您的用户名在不同的类中。我完全错过了。我会将 ClientFrame 类作为参数传递给 ClientPanel,因此您仍然无法访问 ClientPanel 中的 ClientFrame。 我改变了答案希望我现在没有错过任何东西。 谢谢,它解决了我的问题,你的答案中唯一的问题是它没有扩展到:JFrame,它被扩展到了Frame。 :) 能否请您也指导我一些其他的事情,当用户连接和断开连接时如何更新列表?以上是关于java中如何在jframe标题栏中添加按钮的主要内容,如果未能解决你的问题,请参考以下文章