【问题标题】:Manipulating components in a separate class java在单独的类 java 中操作组件
【发布时间】:2015-06-17 23:40:07
【问题描述】:

我有三个 java 类

StitchSorts

import Sorts.*;

public class StitchSorts
{   
    public static void main(String[] args)
    {
        StitchSorts sS = new StitchSorts();
        SortsGui.main(args);
    }
}

SortsGui

package Sorts;

import javax.swing.*;
import java.awt.*;
import net.miginfocom.swing.MigLayout;
import Sorts.*;
import javax.swing.event.*;
import java.awt.event.*;

public class SortsGui
{
    JFrame myMainWindow = new JFrame("Sorts");

    JPanel sortPanel = new JPanel();

    MyMenuBar mbr = new MyMenuBar();

    JTextField txtField = new JTextField();
    JTextField txtField2 = new JTextField();

    public void runGUI()
    {
        myMainWindow.setBounds(10, 10, 800, 800);
        myMainWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        myMainWindow.setLayout(new GridLayout(1,1));

        createSortTestPanel();

        myMainWindow.getContentPane().add(sortPanel);

        myMainWindow.setJMenuBar(mbr);

        myMainWindow.setVisible(true);
    }

    public void createSortTestPanel()
    {
        MigLayout layout = new MigLayout("" , "[grow]");
        sortPanel.setLayout(layout);

        sortPanel.add(txtField,"growx");
        sortPanel.add(txtField2,"growx");
    }

    public void clearTextBoxes()
    {
        for (Component C : sortPanel.getComponents())
        {    
            if (C instanceof JTextField)
            {
                ((JTextField) C).setText("");
                System.out.println("Multiple");
            }
        }
    }

    public static void main(String[] args)
    {
        SortsGui sG = new SortsGui();
        sG.runGUI();
    }
}

我的菜单栏

package Sorts;

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

import java.io.*;
import java.lang.*;

public class MyMenuBar extends JMenuBar
{
    JButton btnClear = new JButton("Clear");
    SortsGui sG;

    public MyMenuBar()
    {
        setBorderPainted(true);
        makePopUpMenu();
    }

    void makePopUpMenu()
    {
        add(Box.createHorizontalGlue());
        clearButton(btnClear);
        add(btnClear);
    }

    public void clearButton(JButton J)
    {
        J.setOpaque(false); //These remove the button filling and border
        J.setContentAreaFilled(false);
        J.setBorder(null);
        J.setMinimumSize(new Dimension(50,25));
        J.setPreferredSize(new Dimension(50,25));
        J.setMaximumSize(new Dimension(50,25));
        J.addActionListener(new buttonPress());
        J.setFocusable(false);
    }

    class buttonPress implements ActionListener
    {
        @Override
        public void actionPerformed(ActionEvent e)
        {               
            if(e.getSource() == btnClear)
            {
                System.out.println("Clearing");
                sG = new SortsGui();
                sG.clearTextBoxes();
            }
        }
    }
}

我在这里想要实现的是,当单击 JButton btnClear 时,SortsGui 中的 JTextFields 应该被清除。当在SortsGui 中调用它时,我设置了公共无效clearTextBoxes 以实现此工作。但是,当该方法被单击的btnClear 调用时,它不会检测到JPanel sortPanel 上的任何JTextField。有没有办法纠正这个问题?如果是这样,最好的方法是什么?

【问题讨论】:

  • 你的代码有点疯狂。对 JMenuBar 进行子类化对我来说没有意义。您应该在附加到菜单的 ActionListener 中提供功能。但是关于您的问题:“检测任何 JTextFields”是什么意思?你的代码哪里有问题?什么方法名和行号?
  • 从您上传的代码中可以明显看出,正在显示的SortsGui 实例和btnClear 操作中使用的SortsGui 实例是不同的实例。所以你的代码不起作用。
  • @Blip 你会怎么做才能让它们在同一个实例中?
  • 他的意思是你调用“new SortGui()”两次(或更多)。只调用一次,并且只使用那个引用。
  • 为什么提到“StitchSorts”?它不会在您的代码中的其他任何地方引用。

标签: java swing miglayout


【解决方案1】:

你的问题在于这里的代码:

    public void actionPerformed(ActionEvent e)
    {               
        if(e.getSource() == btnClear)
        {
            System.out.println("Clearing");
            sG = new SortsGui(); // You are creating a new instance of SortsGui
            sG.clearTextBoxes(); //You are calling the method on this new instance
        }
    }

您的问题的解决方案可以通过在MyMenuBar 的构造函数中传递SortsGui 的实例并将其存储在一个实例变量中,例如sG,就像您在下面的代码中所做的那样:

public MyMenuBar(SortsGui sG)
{
    this.sG = sG;
    setBorderPainted(true);
    makePopUpMenu();
}

现在在执行的操作方法中删除该行:

  sG = new SortsGui();

现在在SortsGui 类中的变量mbr 的初始化中使用以下代码:

MyMenuBar mbr = new MyMenuBar(this);

而不是

MyMenuBar mbr = new MyMenuBar();

我想这会解决你的问题。

【讨论】:

  • 这会产生错误 Sorts\SortsGui.java:16: error: constructor MyMenuBar in class MyMenuBar cannot be applied to given types; MyMenuBar mbr = new MyMenuBar(this);必需:未找到参数:SortsGui 原因:实际参数列表和正式参数列表的长度不同
  • 你是不是先改编译MyMenuBar.java
  • 对不起,那是我的错误。代码工作正常。感谢您的帮助
猜你喜欢
  • 2018-08-02
  • 1970-01-01
  • 2013-09-24
  • 2015-04-21
  • 2021-10-13
  • 2019-11-10
  • 2020-09-17
  • 2013-08-27
  • 2020-11-10
相关资源
最近更新 更多