JTextArea 在添加到 JPanel 时隐藏直到单击
JTextArea hidden until clicked in when added to JPanel
我在这里想要完成的是将 JTextArea 添加到我预先存在的 JPanel 中。当我 运行 程序时,它确实将它添加到我正在寻找的 JPanel 中,但它将 JTextArea 放在 JPanel 后面,直到我单击它应该位于的区域。如果我单击另一个 JTextArea 添加到与我遇到问题的相同的 JPanel,那么整个 JTextArea 将出现。
// Once program works as intended, use CardLayout to switch screens, rather than using JFrame with setVisible(true/false)
// JPanels. Tutorial left on Whosebug with example code. 12/31/15
import java.awt.BorderLayout;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
public class UserInterface implements ActionListener
{
JFrame screen;
JButton start, submit, help;
JPanel UI,userWhite, passWhite;
JLabel usrTxt, passTxt;
JTextArea usrInput, passInput, console;
static String[] strings = new String[2]; //See getInformation() method
HELP runner = new HELP();
public static void main(String args[])
{
UserInterface userinterface = new UserInterface();
userinterface.uiSetup();
userinterface.displaySetup();
userinterface.inputSetup();
userinterface.consoleSetup();
}
public void run()
{
uiSetup();
displaySetup();
inputSetup();
consoleSetup();
}
public void uiSetup()
{
// This method sets up the initial interface which all other
// elements within this program will be built off of
screen = new JFrame("Bing Rewards Bot v.Development 1.0");
screen.setVisible(true);
screen.setSize(800, 600);
screen.setResizable(false);
screen.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
screen.getContentPane().setLayout(new BorderLayout());
UI = new JPanel();
UI.setVisible(true);
UI.setLayout(null);
UI.setBackground(Color.CYAN);
screen.add(UI);
// Buttons must me initialized here. If done in another method,
// it can sometimes block JPanels from appearing. Fixed: 12/27/15
start = new JButton("Start Bot");
start.setVisible(true);
start.setFocusable(false);
start.setBounds(150,500,200,75);
UI.add(start);
submit = new JButton("Submit");
submit.setVisible(true);
submit.setFocusable(false);
submit.setBounds(75,170,100,50);
UI.add(submit);
help = new JButton("HELP");
help.setVisible(true);
help.setFocusable(false);
help.setBounds(455,500,200,75);
help.setActionCommand("helpClicked");
help.addActionListener(this);
UI.add(help);
}
public void displaySetup()
{
// This method sets up the interface text
usrTxt = new JLabel("Bing/Microsoft Account Username");
usrTxt.setFont(new Font("Monospaced", Font.BOLD, 16));
usrTxt.setForeground(Color.BLACK);
usrTxt.setBounds(0,0,310,20); // Adjusts Absolute Size
usrTxt.setLocation(25,50); // Sets Location
UI.add(usrTxt);
passTxt = new JLabel("Password");
passTxt.setFont(new Font("Monospaced", Font.BOLD, 16));
passTxt.setForeground(Color.BLACK);
passTxt.setBounds(0,0,310,20);
passTxt.setLocation(25,100);
UI.add(passTxt);
}
public void consoleSetup()
{
//TODO Appearing behind JPanel: UI
console = new JTextArea("Bing Rewards Bot v.Development 1.1\nInterface Loaded Sucessfully. Awaiting User Input...");
console.setSize(700,200);
console.setLocation(25,260);
console.setBackground(Color.WHITE);
console.setForeground(Color.BLACK);
console.setVisible(true);
console.setEditable(false);
// console.setText("01/02/16//:: Initalizing JTextArea()");
UI.add(console);
}
public void inputSetup()
{
// This method handles the User name and Password field setup
userWhite = new JPanel();
userWhite.setVisible(true);
userWhite.setBackground(Color.WHITE);
userWhite.setLocation(25,70);
userWhite.setSize(200,25);
UI.add(userWhite);
passWhite = new JPanel();
passWhite.setVisible(true);
passWhite.setBackground(Color.WHITE);
passWhite.setLocation(25,120);
passWhite.setSize(200,25);
UI.add(passWhite);
usrInput = new JTextArea();
usrInput.setBounds(0,0,200,18);
usrInput.setLocation(25,75);
usrInput.setBackground(Color.WHITE);
usrInput.setForeground(Color.BLACK);
UI.add(usrInput);
passInput = new JTextArea();
passInput.setBounds(0,0,200,18);
passInput.setLocation(25,125);
passInput.setBackground(Color.WHITE);
passInput.setForeground(Color.BLACK);
UI.add(passInput);
}
public void getInformation()
{
// This method gets the information from the
// JTextAreas in the inputSetup method and
// stores it into an array called "strings"
// ("strings" is initialized in the class)
strings[0] = usrInput.getText();
strings[1] = passInput.getText();
}
public void actionPerformed(ActionEvent e){
if (e.getActionCommand().equals("helpClicked"))
{
UI.setVisible(false);
runner.helpSetup(screen);
}
}
此外,是否需要向 JTextArea 添加滚动窗格?我以前从未使用过 JTextAreas,所以我想我会在程序按预期运行后稍后添加它。
What I'm trying to accomplish here is adding a JTextArea to my pre-existing JPanel
嗯,我不知道你说的是代码的哪一部分。我们没有时间阅读您的整个代码来理解其中的逻辑。
所以我只能做一般性的评论:
1) GUI可见后添加组件的基本代码为:
panel.add( someComponent );
panel.revalidate();
panel.repaint();
2) 不要使用空布局。 Swing 被设计为与布局管理器一起使用,原因太多,无法在此处列出。
3) 变量名不应以大写字符开头。你们中的大多数人的名字都是正确的,但有些人却不正确。保持一致!!!
4) 在使框架可见之前,应将组件添加到框架中。
5) GUI 应该在事件调度线程 (EDT) 上创建。
也许可以从 Layout Manager 上的 Swing 教程开始,了解基本的 Swing 信息和工作演示,这些演示将向您展示如何更好地构建代码。
- 取
screen.setVisible(true);
放在run
的末尾。如果需要动态更新 UI,则需要使用 revalidate
后跟 repaint
来指示 UI 更新其布局信息。如果可能,请使用 CardLayout
在多个视图之间动态切换,请参阅 How to Use CardLayout 了解更多详情
- 避免使用
null
布局,像素完美布局是现代 ui 设计中的一种错觉。影响组件个体大小的因素太多,none 是您可以控制的。 Swing 旨在与核心的布局管理器一起工作,丢弃这些将导致无穷无尽的问题和问题,您将花费越来越多的时间来尝试纠正
我在这里想要完成的是将 JTextArea 添加到我预先存在的 JPanel 中。当我 运行 程序时,它确实将它添加到我正在寻找的 JPanel 中,但它将 JTextArea 放在 JPanel 后面,直到我单击它应该位于的区域。如果我单击另一个 JTextArea 添加到与我遇到问题的相同的 JPanel,那么整个 JTextArea 将出现。
// Once program works as intended, use CardLayout to switch screens, rather than using JFrame with setVisible(true/false)
// JPanels. Tutorial left on Whosebug with example code. 12/31/15
import java.awt.BorderLayout;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
public class UserInterface implements ActionListener
{
JFrame screen;
JButton start, submit, help;
JPanel UI,userWhite, passWhite;
JLabel usrTxt, passTxt;
JTextArea usrInput, passInput, console;
static String[] strings = new String[2]; //See getInformation() method
HELP runner = new HELP();
public static void main(String args[])
{
UserInterface userinterface = new UserInterface();
userinterface.uiSetup();
userinterface.displaySetup();
userinterface.inputSetup();
userinterface.consoleSetup();
}
public void run()
{
uiSetup();
displaySetup();
inputSetup();
consoleSetup();
}
public void uiSetup()
{
// This method sets up the initial interface which all other
// elements within this program will be built off of
screen = new JFrame("Bing Rewards Bot v.Development 1.0");
screen.setVisible(true);
screen.setSize(800, 600);
screen.setResizable(false);
screen.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
screen.getContentPane().setLayout(new BorderLayout());
UI = new JPanel();
UI.setVisible(true);
UI.setLayout(null);
UI.setBackground(Color.CYAN);
screen.add(UI);
// Buttons must me initialized here. If done in another method,
// it can sometimes block JPanels from appearing. Fixed: 12/27/15
start = new JButton("Start Bot");
start.setVisible(true);
start.setFocusable(false);
start.setBounds(150,500,200,75);
UI.add(start);
submit = new JButton("Submit");
submit.setVisible(true);
submit.setFocusable(false);
submit.setBounds(75,170,100,50);
UI.add(submit);
help = new JButton("HELP");
help.setVisible(true);
help.setFocusable(false);
help.setBounds(455,500,200,75);
help.setActionCommand("helpClicked");
help.addActionListener(this);
UI.add(help);
}
public void displaySetup()
{
// This method sets up the interface text
usrTxt = new JLabel("Bing/Microsoft Account Username");
usrTxt.setFont(new Font("Monospaced", Font.BOLD, 16));
usrTxt.setForeground(Color.BLACK);
usrTxt.setBounds(0,0,310,20); // Adjusts Absolute Size
usrTxt.setLocation(25,50); // Sets Location
UI.add(usrTxt);
passTxt = new JLabel("Password");
passTxt.setFont(new Font("Monospaced", Font.BOLD, 16));
passTxt.setForeground(Color.BLACK);
passTxt.setBounds(0,0,310,20);
passTxt.setLocation(25,100);
UI.add(passTxt);
}
public void consoleSetup()
{
//TODO Appearing behind JPanel: UI
console = new JTextArea("Bing Rewards Bot v.Development 1.1\nInterface Loaded Sucessfully. Awaiting User Input...");
console.setSize(700,200);
console.setLocation(25,260);
console.setBackground(Color.WHITE);
console.setForeground(Color.BLACK);
console.setVisible(true);
console.setEditable(false);
// console.setText("01/02/16//:: Initalizing JTextArea()");
UI.add(console);
}
public void inputSetup()
{
// This method handles the User name and Password field setup
userWhite = new JPanel();
userWhite.setVisible(true);
userWhite.setBackground(Color.WHITE);
userWhite.setLocation(25,70);
userWhite.setSize(200,25);
UI.add(userWhite);
passWhite = new JPanel();
passWhite.setVisible(true);
passWhite.setBackground(Color.WHITE);
passWhite.setLocation(25,120);
passWhite.setSize(200,25);
UI.add(passWhite);
usrInput = new JTextArea();
usrInput.setBounds(0,0,200,18);
usrInput.setLocation(25,75);
usrInput.setBackground(Color.WHITE);
usrInput.setForeground(Color.BLACK);
UI.add(usrInput);
passInput = new JTextArea();
passInput.setBounds(0,0,200,18);
passInput.setLocation(25,125);
passInput.setBackground(Color.WHITE);
passInput.setForeground(Color.BLACK);
UI.add(passInput);
}
public void getInformation()
{
// This method gets the information from the
// JTextAreas in the inputSetup method and
// stores it into an array called "strings"
// ("strings" is initialized in the class)
strings[0] = usrInput.getText();
strings[1] = passInput.getText();
}
public void actionPerformed(ActionEvent e){
if (e.getActionCommand().equals("helpClicked"))
{
UI.setVisible(false);
runner.helpSetup(screen);
}
}
此外,是否需要向 JTextArea 添加滚动窗格?我以前从未使用过 JTextAreas,所以我想我会在程序按预期运行后稍后添加它。
What I'm trying to accomplish here is adding a JTextArea to my pre-existing JPanel
嗯,我不知道你说的是代码的哪一部分。我们没有时间阅读您的整个代码来理解其中的逻辑。
所以我只能做一般性的评论:
1) GUI可见后添加组件的基本代码为:
panel.add( someComponent );
panel.revalidate();
panel.repaint();
2) 不要使用空布局。 Swing 被设计为与布局管理器一起使用,原因太多,无法在此处列出。
3) 变量名不应以大写字符开头。你们中的大多数人的名字都是正确的,但有些人却不正确。保持一致!!!
4) 在使框架可见之前,应将组件添加到框架中。
5) GUI 应该在事件调度线程 (EDT) 上创建。
也许可以从 Layout Manager 上的 Swing 教程开始,了解基本的 Swing 信息和工作演示,这些演示将向您展示如何更好地构建代码。
- 取
screen.setVisible(true);
放在run
的末尾。如果需要动态更新 UI,则需要使用revalidate
后跟repaint
来指示 UI 更新其布局信息。如果可能,请使用CardLayout
在多个视图之间动态切换,请参阅 How to Use CardLayout 了解更多详情 - 避免使用
null
布局,像素完美布局是现代 ui 设计中的一种错觉。影响组件个体大小的因素太多,none 是您可以控制的。 Swing 旨在与核心的布局管理器一起工作,丢弃这些将导致无穷无尽的问题和问题,您将花费越来越多的时间来尝试纠正