2017-04-06 90 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(); 
    } 
} 
相關問題