新しい JFrame オブジェクトを作成するたびに、フレームが 0,0 の位置に表示されます。setLocationRelativeTo() を使用してウィンドウを中央に配置する方法を調べてみましたが、コンテナーで呼び出しようとしたすべてがコンパイル不能なコードとして表示されます。ここに私が使用している私のクラスの1つがあります:
package Ginfo;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import javax.swing.*;
public class EditUsers extends JFrame implements ActionListener
{
Container EU;
JPanel modUsers, button, output;
JLabel user, password;
JTextField tuser, tpassword;
JTextArea toutput;
JButton addAdmin, addStand, editPass, removeUser, exit;
ObjectOutputStream oout;
ObjectInputStream oin;
Message m;
ConnectInfo c;
public EditUsers (ObjectOutputStream oout2, ObjectInputStream oin2, Message m2, ConnectInfo a)
{
super("User Modifications");
EU = getContentPane();
oout = oout2;
try
{
oout.reset();
}
catch (IOException e)
{
e.printStackTrace();
}
oin = oin2;
m = m2;
c = a;
buildUserInfoPanel();
buildOutputPanel();
buildButtonPanel();
EU.add(modUsers, BorderLayout.NORTH);
EU.add(output, BorderLayout.CENTER);
EU.add(button, BorderLayout.SOUTH);
pack();
setVisible(true);
}
private void buildUserInfoPanel()
{
modUsers = new JPanel();
modUsers.setLayout(new GridLayout (2,2));
user = new JLabel ("Enter the username you wish to edit: ");
tuser = new JTextField (15);
password = new JLabel("Enter their new password: ");
tpassword = new JTextField(15);
modUsers.add(user);
modUsers.add(tuser);
modUsers.add(password);
modUsers.add(tpassword);
}
private void buildOutputPanel()
{
output = new JPanel();
toutput = new JTextArea();
toutput.setPreferredSize(new Dimension (400,100));
output.add(toutput);
}
private void buildButtonPanel()
{
button = new JPanel();
addAdmin = new JButton ("Add user as administrator");
addStand = new JButton ("Add user as standard");
editPass = new JButton ("Change password");
removeUser = new JButton ("Remove user");
exit = new JButton ("Back");
button.add(addAdmin);
button.add(addStand);
button.add(editPass);
button.add(removeUser);
button.add(exit);
addAdmin.addActionListener(this);
addStand.addActionListener(this);
editPass.addActionListener(this);
removeUser.addActionListener(this);
exit.addActionListener(this);
}
public void actionPerformed(ActionEvent e)
{
if (e.getSource() == addAdmin)
{
m.type = Message.ADDADMIN;
m.main = tuser.getText();
m.setPassword = tpassword.getText();
m.setPermission = 1;
}
else if (e.getSource() == addStand)
{
m.type = Message.ADDSTANDARD;
m.main = tuser.getText();
m.setPassword = tpassword.getText();
m.setPermission = 2;
}
else if (e.getSource() == editPass)
{
m.type = Message.CHANGEPASSWORD;
m.main = tuser.getText();
m.setPassword = tpassword.getText();
}
else if (e.getSource() == removeUser)
{
m.type = Message.REMOVEUSER;
m.main = tuser.getText();
}
else if (e.getSource() == exit)
{
new WhatToDo (oout, oin, m, c);
dispose();
return;
}
try
{
oout.writeObject(m);
m = (Message)oin.readObject();
toutput.setText(m.response);
}
catch (IOException e1)
{
e1.printStackTrace();
}
catch (ClassNotFoundException e1)
{
e1.printStackTrace();
}
}
}
このコードを実行すると、ウィンドウは (0,0) の位置から始まります。私がやりたいのは、ウィンドウのサイズを実行中のコンピューターの解像度の 1/4 に変更し、ウィンドウの位置をリセットして、ウィンドウの中心が画面の中心になるようにすることです。解像度が 1000x1000 の場合、ウィンドウは 250x250 で、(500 - 250/2)X,(500 - 250/2)Y (左上隅) x (500 + 250/2)X, (500 + 250/2) に配置する必要があります。 )Y (右下隅)
(注意してください、プロセスが完了したときにウィンドウを開いたり閉じたりするウィンドウごとに異なるクラスを使用しているため、他のクラスがないと、これは完全にコンパイルできません。私は ObjectOutputStream、ObjectInputStream、オブジェクト I を渡しています。 Message を呼び出し、別のオブジェクトを ConnectInfo と呼びます。出力ストリームと入力ストリームはサーバーへの接続を維持するためのものです。Message は前後に送信されるシリアル化された情報であり、ConnectionInfo は本質的に Cookie 情報 (ユーザー接続、セッション情報、アクセス許可) を保持します。レベルなど)。
さて、私は持っています
package Ginfo;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import javax.swing.*;
public class EditUsers implements ActionListener
{
Container EU;
JFrame myJFrame;
JPanel modUsers, button, output;
JLabel user, password;
JTextField tuser, tpassword;
JTextArea toutput;
JButton addAdmin, addStand, editPass, removeUser, exit;
ObjectOutputStream oout;
ObjectInputStream oin;
Message m;
ConnectInfo c;
public EditUsers (ObjectOutputStream oout2, ObjectInputStream oin2, Message m2, ConnectInfo a)
{
myJFrame = new JFrame("User Modifications");
EU = myJFrame.getContentPane();
oout = oout2;
try
{
oout.reset();
}
catch (IOException e)
{
e.printStackTrace();
}
oin = oin2;
m = m2;
c = a;
buildUserInfoPanel();
buildOutputPanel();
buildButtonPanel();
EU.add(modUsers, BorderLayout.NORTH);
EU.add(output, BorderLayout.CENTER);
EU.add(button, BorderLayout.SOUTH);
myJFrame.add(EU);
myJFrame.pack();
myJFrame.setVisible(true);
}
private void buildUserInfoPanel()
{
modUsers = new JPanel();
modUsers.setLayout(new GridLayout (2,2));
user = new JLabel ("Enter the username you wish to edit: ");
tuser = new JTextField (15);
password = new JLabel("Enter their new password: ");
tpassword = new JTextField(15);
modUsers.add(user);
modUsers.add(tuser);
modUsers.add(password);
modUsers.add(tpassword);
}
private void buildOutputPanel()
{
output = new JPanel();
toutput = new JTextArea();
toutput.setPreferredSize(new Dimension (200,100));
output.add(toutput);
}
private void buildButtonPanel()
{
button = new JPanel();
addAdmin = new JButton ("Add user as administrator");
addStand = new JButton ("Add user as standard");
editPass = new JButton ("Change password");
removeUser = new JButton ("Remove user");
exit = new JButton ("Back");
button.add(addAdmin);
button.add(addStand);
button.add(editPass);
button.add(removeUser);
button.add(exit);
addAdmin.addActionListener(this);
addStand.addActionListener(this);
editPass.addActionListener(this);
removeUser.addActionListener(this);
exit.addActionListener(this);
}
public void actionPerformed(ActionEvent e)
{
if (e.getSource() == addAdmin)
{
m.type = Message.ADDADMIN;
m.main = tuser.getText();
m.setPassword = tpassword.getText();
m.setPermission = 1;
}
else if (e.getSource() == addStand)
{
m.type = Message.ADDSTANDARD;
m.main = tuser.getText();
m.setPassword = tpassword.getText();
m.setPermission = 2;
}
else if (e.getSource() == editPass)
{
m.type = Message.CHANGEPASSWORD;
m.main = tuser.getText();
m.setPassword = tpassword.getText();
}
else if (e.getSource() == removeUser)
{
m.type = Message.REMOVEUSER;
m.main = tuser.getText();
}
else if (e.getSource() == exit)
{
new WhatToDo (oout, oin, m, c);
myJFrame.dispose();
return;
}
try
{
oout.writeObject(m);
m = (Message)oin.readObject();
toutput.setText(m.response);
}
catch (IOException e1)
{
e1.printStackTrace();
}
catch (ClassNotFoundException e1)
{
e1.printStackTrace();
}
}
}
現在、問題は myJFrame.add(EU) にあり、「java.lang.IllegalArgumentException: コンテナーの親をそれ自体に追加しています」と表示されます。事前に助けてくれてありがとう。