java 隐藏按钮_Java:Swing:按下按钮后隐藏框架

你的问题是这一行:

frame.add(new ConnectionFrame());

你正在创建一个新的ConnectionFrame对象,从而显示了一个你的按钮尝试关闭的框架是不一样的,这是你问题的根源。

如果将其更改为,

//!! frame.add(new ConnectionFrame());

frame.add(this);

使两个JFrames是同一个,事情可能会更加顺畅。但是话说回来,你的整个设计闻起来很糟糕,我会以更多的面向对象和更不静态的方式重新考虑它。此外,使用对话框需要对话框,而不是框架,而不是对话框考虑通过CardLayout交换视图(JPanels)作为更好的选择。我为此创建了一个“哑巴”GUI,创建一个JPanel(在我的例子中,为了简单起见,它扩展了一个JPanel,但如果不是必要的话,我会避免扩展),而且我会让任何调用此代码的人决定如何通过某种控制来处理这些信息。

public interface ConnectionPanelControl {

void connectButtonAction();

} :对于如

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

@SuppressWarnings("serial")

public class ConnectionPanel extends JPanel {

private JTextField textField;

private JButton connectButton;

private ConnectionPanelControl control;

public ConnectionPanel(final ConnectionPanelControl control) {

super(new GridBagLayout());

this.control = control;

ActionListener listener = new ActionListener() {

public void actionPerformed(ActionEvent e) {

if (control != null) {

control.connectButtonAction();

}

}

};

textField = new JTextField(14);

textField.addActionListener(listener);

textField.setText("/dev/ttyUSB0");

connectButton = new JButton("Connect");

GridBagConstraints c = new GridBagConstraints();

c.gridwidth = GridBagConstraints.REMAINDER;

c.fill = GridBagConstraints.HORIZONTAL;

add(textField, c);

c.fill = GridBagConstraints.BOTH;

c.weightx = 1.0;

c.weighty = 1.0;

add(connectButton, c);

connectButton.addActionListener(listener);

}

public String getFieldText() {

return textField.getText();

}

}

再次,简单的GUI之外的东西会在如何处理文本字段包含文本和什么做是显示此JPanel的GUI做决策

此外,您可能会在后台线程中进行任何连接,以免冻结GUI,可能是SwingWorker。也许这样的事情:

import java.awt.event.ActionEvent;

import java.util.concurrent.ExecutionException;

import javax.swing.*;

@SuppressWarnings("serial")

public class MyMain extends JPanel {

public MyMain() {

add(new JButton(new ConnectionAction("Connect", this)));

}

private static void createAndShowGui() {

JFrame frame = new JFrame("My Main");

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

frame.getContentPane().add(new MyMain());

frame.pack();

frame.setLocationRelativeTo(null);

frame.setVisible(true);

}

public static void main(String[] args) {

SwingUtilities.invokeLater(new Runnable() {

public void run() {

createAndShowGui();

}

});

}

}

@SuppressWarnings("serial")

class ConnectionAction extends AbstractAction {

private MyMain myMain;

private ConnectionPanel cPanel = null;

private JDialog dialog = null;

public ConnectionAction(String title, MyMain myMain) {

super(title);

this.myMain = myMain;

}

@Override

public void actionPerformed(ActionEvent e) {

if (dialog == null) {

dialog = new JDialog(SwingUtilities.getWindowAncestor(myMain));

dialog.setTitle("Connect");

dialog.setModal(true);

cPanel = new ConnectionPanel(new ConnectionPanelControl() {

@Override

public void connectButtonAction() {

final String connectStr = cPanel.getFieldText();

new MySwingWorker(connectStr).execute();

}

});

dialog.getContentPane().add(cPanel);

dialog.pack();

dialog.setLocationRelativeTo(null);

}

dialog.setVisible(true);

}

private class MySwingWorker extends SwingWorker {

private String connectStr = "";

public MySwingWorker(String connectStr) {

this.connectStr = connectStr;

}

@Override

protected Boolean doInBackground() throws Exception {

// TODO: make connection and then return a result

// right now making true if any text in the field

if (!connectStr.isEmpty()) {

return true;

}

return false;

}

@Override

protected void done() {

try {

boolean result = get();

if (result) {

System.out.println("connection successful");

dialog.dispose();

} else {

System.out.println("connection not successful");

}

} catch (InterruptedException e) {

e.printStackTrace();

} catch (ExecutionException e) {

e.printStackTrace();

}

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值