2017-04-06 109 views
0

我是Java编程新手。我想在该类中创建JButton,并通过传递按钮参数在主体中创建ActionListener。但它会报错:JButton中的类和actionlistener上的主

Cannot make a static reference to the non-static field newBtn 

我的代码如下。

import java.awt.event.*; 
import javax.swing.*;  
public class TestBtn { 

TestBtn() { 
} 

public void myBtn(JButton mybtn){ 
    JFrame f=new JFrame("My Example"); 

    mybtn =new JButton("Click Here"); 
    mybtn.setBounds(50,100,95,30); 

    f.add(mybtn); 
    f.setSize(400,400); 
    f.setLayout(null); 
    f.setVisible(true); 
} 
} 

//我的主要计划

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

import javax.swing.*; 
public class TestBtnMain { 
    JButton newBtn; 

public static void main(String[] args) { 
    TestBtn btn = new TestBtn(); 
    btn.myBtn(newBtn); 

    newBtn.addActionListener(new ActionListener(){ 
     public void actionPerformed(ActionEvent e){ 
      System.out.println("Success"); 
      } 
     }); 
} 
} 
+0

只是不这样做......非常糟糕的编程风格。 'public class TestBtnMain {JB} newBtn; '应该是'public class TestBtnMain {静态JButton newBtn; ' – XtremeBaumer

+0

*“我想在类内创建'JButton',并通过传递按钮参数在主类中创建'ActionListener'。”*为什么?请参阅[什么是XY问题?](http://meta.stackexchange.com/q/66377)*“我是Java编程新手”。*那么您可能应该避免一段时间的GUI编程。这是一个高级话题。回到GUI编程,'f.setLayout(null);'这是你应该**从未做过的事情之一。 Java GUI必须在不同的语言环境中使用不同的PLAF来处理不同的操作系统,屏幕大小,屏幕分辨率等。因此,他们不利于.. –

+0

..像素完美的布局。请使用布局管理器或[它们的组合](http://stackoverflow.com/a/5630271/418556)以及[white space]的布局填充和边框(http://stackoverflow.com/a/17874718/ 418556)。 –

回答

2

与C++不同,Java不可能通过引用传输参数。因此,作为以下我会改变你的代码:

import java.awt.event.*; 
import javax.swing.*;  
public class TestBtn { 

    TestBtn() { 

    } 
    public JButton myBtn(){ 

     JFrame f=new JFrame("My Example"); 

     JButton mybtn =new JButton("Click Here"); 
     mybtn.setBounds(50,100,95,30); 

     f.add(mybtn); 
     f.setSize(400,400); 
     f.setLayout(null); 
     f.setVisible(true); 
     return mybtn; 
    } 

} 

主要类:

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

import javax.swing.*; 
public class TestBtnMain { 

    public static void main(String[] args) { 
     TestBtn btn = new TestBtn(); 
     JButton newBtn = btn.myBtn(); 

     newBtn.addActionListener(new ActionListener(){ 
      public void actionPerformed(ActionEvent e){ 
       System.out.println("Success"); 
      } 
     }); 


    } 
} 

,而且前面已经由安德鲁·汤普森提到的,你应该使用一个布局管理器,使您的用户界面与不同的平台上工作/屏幕分辨率

+0

非常感谢。有用。 – Rajesh

0

您使用的是可变newBtn不使用任何对象。它是一个实例变量,因此需要访问一个对象。

这种说法应改为

btn.myBtn(newBtn); 

使用类TestBtnMain的实例访问newBtn

,或者你可以让newBtn静态的。

static JButton newBtn; 
+0

现在错误消失了。但是actionlistener不起作用 – Rajesh

+0

在'myBtn'方法中添加actionListener –

0

你TestBtn类应该是:

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

public class TestBtn { 
    private JFrame f; 
    private JButton mybtn; 

TestBtn() { 
     f=new JFrame("My Example"); 
     mybtn =new JButton("Click Here"); 
} 

public void myBtn(){ 

    mybtn.setBounds(50,100,95,30); 
    mybtn.addActionListener(new ActionListener(){ 
     public void actionPerformed(ActionEvent e){ 
      System.out.println("Success"); 
     } 
    }); 

    f.add(mybtn); 
    f.setSize(400,400); 
    f.setLayout(null); 
    f.setVisible(true); 
    } 
} 

而且你的主要功能:

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

public class TestBtnMain { 

    public static void main(String[] args) { 
     TestBtn btn = new TestBtn(); 
     btn.myBtn(); 
    } 
} 
相关问题