Java JDialogs之间如何传递信息?

标签 java swing jframe jdialog

在寻找答案3个小时后,我正要放弃这个想法:

我正在制作一个显示 Twitch 主播关注者的应用程序。 我试图添加几个功能:

显示框架是与控件框架分开的窗口。 我正在尝试使用(JFrame 作为显示窗口)(JDialog 作为控件框架) 此外:设置位于另一个 JDialog 中(这个有 Modal(true)) 设置需要能够发送 JFrame 信息,例如:“用户名”和“文本颜色” 并且设置JDialog只有在点击控件JDialog上的“设置”时才会弹出。 当您单击“保存设置”或 X 时,它将设置 Visible(false)。 在控件上 JDialog (b_console) 需要接收错误消息和类似信息。 在同一个 JDialog 上,“filler”需要接收关注者计数等信息。

以下是涉及上面列出的传输的我的代码:

package javafollowernotifier;
import java.awt.*;
import java.awt.event.*;
import java.awt.Graphics.*;
import javax.swing.*;
import java.io.*;
import java.net.URL;

public class JavaFollowerNotifier extends JFrame implements ComponentListener
{
    Settings settings = new Settings();
    ControlPanel ctrlPnl = new ControlPanel();

    public JavaFollowerNotifier()
    {        
        try
        {
            settings.readSettings();
        }
        catch(Exception e)
        {
            ctrlPnl.b_console.setText("Error");
            System.out.println(e);
        }
    }

    public void grabFollower()
    {
        ctrlPnl.b_console.setText("Retrieving Info...");

        try
        {
            URL twitch = new URL("https://api.twitch.tv/kraken/channels/" + savedSettings[1] + "/follows?limit=1&offset=0");

            ctrlPnl.b_console.setText("Retrieved");
        }
        catch(Exception e)
        {
            ctrlPnl.b_console.setText("Error");
            System.out.println(e);
        }
    }

    public void grabStats()
    {            
        ctrlPnl.b_console.setText("Retrieving Info...");

        try
        {
            URL twitch = new URL("https://api.twitch.tv/kraken/channels/" + savedSettings[1] + "/follows?limit=1&offset=0");

            ctrlPnl.filler.setText("Followers: " + totalFollowers + "\nLatest: " + lastFollower);
            ctrlPnl.b_console.setText("Retrieved");
        }
        catch(Exception e)
        {
            ctrlPnl.b_console.setText("Error");
            System.out.println(e);
        }
    }

    public void componentMoved(ComponentEvent arg0)
    {
        //this is only to *attach this JDialog to the JFrame and make it move together my plan is to have it undecorated as well
        int x = this.getX() + this.getWidth();
        int y = this.getY();
        ctrlPnl.movePanel(x, y);
    }

    public void paint(Graphics g)
    {
        if(clearPaint == false)
        {
            //any "savedSettings[n]" are saved in Settings.java (just not in this version)
            g.setColor(Color.decode(savedSettings[3]));
            scaledFont = scaleFont(follower + " followed!", bounds, g, new Font(savedSettings[2], Font.PLAIN, 200));
        }
    }
}



package javafollowernotifier;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import javax.imageio.ImageIO;
import javax.swing.*;

public class Settings extends JDialog implements ActionListener
{
    JavaFollowerNotifier jfollow = new JavaFollowerNotifier();
    ControlPanel ctrlPnl = new ControlPanel();

    //here are the settings mention above
    String[] savedSettings = {"imgs/b_b.jpg","username","font","color","Nightbot"};

    public Settings()
    {         
        try
        {
           UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        }
        catch (Exception e)
        {
            ctrlPnl.b_console.setText("Error");
            System.out.println(e);
        }
    }

    public void saveSettings()
    {
            savedSettings[4] = jfollow.lastFollower;

        try
        {
            PrintWriter save = new PrintWriter("config.cfg");
            ctrlPnl.b_console.setText("Saving...");
            for(int i = 0; i < 5; i++)
            {
                save.println(savedSettings[i]);
            }
            save.close();
            ctrlPnl.b_console.setText("Saved");
        }
        catch(Exception e)
        {
            ctrlPnl.b_console.setText("Error");
            System.out.println(e);
            canClose = false;
        }

        readSettings();
        this.repaint();
    }

    public void readSettings()
    {
        ctrlPnl.b_console.setText("Loading...");

        try
        {
        }
        catch(Exception e)
        {
            ctrlPnl.b_console.setText("Error");
            System.out.println(e);
        }

        jfollow.lastFollower = savedSettings[4];

        try
        {
        }
        catch(Exception e)
        {
            ctrlPnl.b_console.setText("Error");
            System.out.println(e);
        }

        ctrlPnl.b_console.setText("Loaded Settings");
    }
}



package javafollowernotifier;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class ControlPanel extends JDialog implements ActionListener
{      
    public ControlPanel()
    {
        try
        {
        }
        catch (Exception e)
        {
            b_console.setText("Error");
            System.out.println(e);
        }
    }

    public void movePanel(int x, int y)
    {
        //here is where i *attach the JDialog to the JFrame
        controlPanel.setLocation(x, y);
    }

    public void actionPerformed(ActionEvent ie)
    {
        if(ie.getSource() == b_settings)
        {
            settings.frame.setVisible(true);
        }
    }
}

最佳答案

我试图修复你的程序,但我不太确定它的流程。所以我创建了另一个简单的。我所做的是将标签从主框架传递到对话框的构造函数。在对话框中,我获取了这些标签,并使用在文本字段中输入的文本更改了它们。如果在对话框中写入文本后按 Enter 键,您将看到框架中的文本发生变化

public class JavaFollowerNotifier1 extends JFrame{

    private JLabel controlDialogLabel = new JLabel("  ");
    private JLabel settingDialogLabel = new JLabel("  ");
    private ControlDialog control;
    private SettingsDialog settings;

    public JavaFollowerNotifier1() {
        control = new ControlDialog(this, true, controlDialogLabel);
        settings = new SettingsDialog(this, true, settingDialogLabel);

....

class ControlDialog extends JDialog {
    private JLabel label;

    public ControlDialog(final Frame frame, boolean modal, final JLabel label) {
        super(frame, modal);
        this.label = label;

....

class SettingsDialog extends JDialog {
    private JLabel label;

    public SettingsDialog(final Frame frame, boolean modal, final JLabel label) {
        super(frame, modal);
        this.label = label;

测试一下,如果您有任何问题请告诉我

import java.awt.BorderLayout;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

public class JavaFollowerNotifier1 extends JFrame{

    private JLabel controlDialogLabel = new JLabel("  ");
    private JLabel settingDialogLabel = new JLabel("  ");

    private JButton showControl = new JButton("Show Control");
    private JButton showSetting = new JButton("Show Settings");

    private ControlDialog control;
    private SettingsDialog settings;

    public JavaFollowerNotifier1() {
        control = new ControlDialog(this, true, controlDialogLabel);
        settings = new SettingsDialog(this, true, settingDialogLabel);


        showControl.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e) {
                control.setVisible(true);
            }
        });
        showSetting.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e) {
                settings.setVisible(true);
            }
        });

        JPanel buttonPanel = new JPanel();
        buttonPanel.add(showControl);
        buttonPanel.add(showSetting);

        add(buttonPanel, BorderLayout.SOUTH);
        add(controlDialogLabel, BorderLayout.NORTH);
        add(settingDialogLabel, BorderLayout.CENTER);

        pack();
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new JavaFollowerNotifier1();
            }
        });
    }

}

class ControlDialog extends JDialog {
    private JLabel label;
    private JTextField field = new JTextField(15);
    private JButton button = new JButton("Close");
    private String s = "";

    public ControlDialog(final Frame frame, boolean modal, final JLabel label) {
        super(frame, modal);
        this.label = label;

        setLayout(new BorderLayout());
        add(field, BorderLayout.NORTH);
        add(button, BorderLayout.CENTER);

        pack();
        setLocationRelativeTo(frame);

        field.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e) {
                s = field.getText();
                label.setText("Message from Control Dialog: " + s);
            }
        });
        button.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e) {
                ControlDialog.this.setVisible(false);
            }
        });
    }
}

class SettingsDialog extends JDialog {
    private JLabel label;
    private JTextField field = new JTextField(15);
    private JButton button = new JButton("Close");
    private String s = "";

    public SettingsDialog(final Frame frame, boolean modal, final JLabel label) {
        super(frame, modal);
        this.label = label;

        setLayout(new BorderLayout());
        add(field, BorderLayout.NORTH);
        add(button, BorderLayout.CENTER);

        pack();
        setLocationRelativeTo(frame);

        field.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e) {
                s = field.getText();
                label.setText("Message from Settings Dialog: " + s);
            }
        });
        button.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e) {
                SettingsDialog.this.setVisible(false);
            }
        });
    }
}

enter image description here

关于Java JDialogs之间如何传递信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21035120/

相关文章:

java - 为什么数组类没有任何实用程序方法?

java - JList 不会出现在 JFrame 上

java - Java 中的错误 : cannot find symbol super. PaintComponent(g)

java - 级联 I/O 流是一种不好的做法吗?

java - playframework ebean 中的自定义桥接表

java - 如何用不同的方法从子类关闭 JFrame?

java - JDialog为主窗口时正确关闭java程序

java - 缩小边距 - Java 打印

java - 监听 JFrame 的 Action

java - 即使其子组件获得焦点,也获取 JFrame 的鼠标位置