2017-11-09 9 views
0

메인 레이지에 cardlayout을 사용했습니다. 그 카드 레이아웃에 첫 번째 패널을 추가했습니다. 첫 번째 패널에서 프레임의 이미지를 숨기려고합니다. 그래서자바에서 프레임 간 통신 제공 방법

내 주요 클래스, 내가 패널에서 프레임에 통신을 제공하는 인터페이스를 위해 사용하고

public class HomePage implements OptionMenuListener{ 

    private static void createAndShowGUI() { 

     JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // Already there 
     frame.setUndecorated(true); 
     frame.setLocationRelativeTo(null); 

     JPanel contentPane = new JPanel(); 
     contentPane.setLayout(new CardLayout(20, 20)); 

     File file = new File(jsonFilePath); 
     if(!file.exists()) { 
      LoginPage login = new LoginPage(); 
      contentPane.add(login, Constants.CARD_LOGIN); 
      ConfigueBranch configureBranch = new ConfigueBranch(false); 
      contentPane.add(configureBranch, Constants.CARD_CONFIGURE_BRANCH); 
      ConfigureSystem configureSystem = new ConfigureSystem(false); 
      contentPane.add(configureSystem, Constants.CARD_CONFIGURE_SYSTEM); 
      ConfigureCustomer configureCustomer = new ConfigureCustomer(false); 
      contentPane.add(configureCustomer, Constants.CARD_CONFIGURE_CUSTOMER); 
     } 
     MainPage mainPage = new MainPage(HomePage.this); 
     contentPane.add(mainPage, Constants.CARD_MAINPAGE); 
//  SettingsPage configureExpinContainer = new SettingsPage(); 
//  contentPane.add(configureExpinContainer, Constants.CARD_SETTINGS_PAGE); 

     JPanel buttonPanel = new JPanel(); 
     buttonPanel.setBorder(new EmptyBorder(50, 10, 10, 10)); 

     Image image = MyUtil.loadImage("/logo.png"); // transform it 
     Image newimg = image.getScaledInstance(244, 80, java.awt.Image.SCALE_SMOOTH); 
     ImageIcon icon = new ImageIcon(newimg); // transform it back 
     JLabel label = new JLabel("", icon, JLabel.LEFT); 
     label.setFont(new java.awt.Font("Arial", Font.BOLD, 24)); 
     label.setOpaque(true); 
     label.setForeground(Color.BLACK); 
     label.setBounds(0, 60, 300, 200); 
     buttonPanel.add(label); 
     frame.add(contentPane, BorderLayout.CENTER); 
     frame.add(buttonPanel, BorderLayout.PAGE_START); 
     frame.pack(); 
     frame.setSize(1000, 700); 
     centeredFrame(frame); 
     frame.setVisible(true); 
     frame.setResizable(false); 
    } 

    public static void centeredFrame(javax.swing.JFrame objFrame) { 
     Dimension objDimension = Toolkit.getDefaultToolkit().getScreenSize(); 
     int iCoordX = (objDimension.width - objFrame.getWidth())/2; 
     int iCoordY = (objDimension.height - objFrame.getHeight())/2; 
     objFrame.setLocation(iCoordX, iCoordY); 
    } 

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

    @Override 
    public void onMenuSelect(boolean isShow) { 

    } 
} 

,

public interface OptionMenuListener { 
    void onMenuSelect(boolean isShow); 
} 

내가 사용하고, 코드를 아래와 같이 인터페이스를 사용했다

공개 클래스 메인 페이지는 JPanel {

JButton inputOutputFilesBtn, syncBtn, tsBtn, settingsBtn; 
public MainPage(HomePage homePage){ 
    homePage.onMenuSelect(true); 
    init(); 
} 

public void init(){ 
    JTabbedPane jtbExample = new JTabbedPane(); 
    JPanel jplInnerPanel1 = createInnerPanel("No device connected"); 
    jtbExample.addTab("Input and Output Files", jplInnerPanel1); 
    jtbExample.setSelectedIndex(0); 
    JPanel jplInnerPanel2 = createInnerPanel("No device connected"); 
    jtbExample.addTab("Sync", jplInnerPanel2); 
    JPanel jplInnerPanel3; 
    if(configuredSystem.equalsIgnoreCase("Expeditors")) { 
     jplInnerPanel3 = createInnerPanel("No device connected"); 
     jtbExample.addTab("TS", jplInnerPanel3); 
    } 
    JPanel jplInnerPanel4 = new SettingsPage(); 
    jtbExample.addTab("Settings", jplInnerPanel4); 
    JPanel jplInnerPanel5 = new LogoutPage(); 
    jtbExample.addTab("Logout", jplInnerPanel5); 
    this.setLayout(new BorderLayout()); 
    this.setPreferredSize(new Dimension(620, 400)); 
    this.add(jtbExample, BorderLayout.CENTER); 
    add(jtbExample); 

} 

protected JPanel createInnerPanel(String text) { 
    JPanel jplPanel = new JPanel(); 
    JLabel jlbDisplay = new JLabel(text); 
    jlbDisplay.setHorizontalAlignment(JLabel.CENTER); 
    jplPanel.setLayout(new GridLayout(1, 1)); 
    jplPanel.add(jlbDisplay); 
    return jplPanel; 
} 
012 3,516,

하지만 난 지금 내가 cardlayout이 프레임에 패널에서 몇 가지 정보를 보낼

MainPage mainPage = new MainPage(HomePage.this); 

라인

다음은이에 정적 컨텍스트 오류로 인해이를 사용할 수 없습니다 을 얻고있다. 이 아이디어를 나에게 제안 해 주시겠습니까? 미리 감사드립니다.

+0

원하는 작업이 무엇 정적 컨텍스트 외부에서 그 논리를 이동해야? 'HomePage.this'는'static' 컨텍스트가 아닌 경우 인스턴스가됩니다. 여기, '이'는 존재하지 않는다. 인스턴스가 필요하면 HomePage의 생성자/메소드에 코드를 삽입하거나 단순히 인스턴스 HomePage hp = new HomePage()를 선언하고 인스턴스를 MainPage에 전달하십시오. 나를 위해,이 디자인 문제입니다, 정적 메서드에서 많은 GUI 초기화하지 마십시오. – AxelH

+0

'createAndShowGUI' 메소드를 정적이 아닌 메소드로 만듭니다. 패널에서 프레임으로 몇 가지 정보를 보내려면 프레임에 메서드를 만들고 패널에서 호출하십시오. –

+0

@JaySmith 응답 해 주셔서 감사합니다. public static void centeredFrame (javax.swing.JFrame objFrame) {} 메서드 – Olive

답변

0

this은 메소드를 실행하는 클래스 인스턴스를 나타내므로 정적 컨텍스트에서는 this을 사용할 수 없습니다. 여기에서는 정적 컨텍스트에 있으므로 인스턴스가 없습니다.

private static void createAndShowGUI() { 
    MainPage mainPage = new MainPage(HomePage.this); 
} 

당신은 하나의 변수

private static void createAndShowGUI() { 
    HomePage homePage = /*initialize or get it from somewhere */ 
    MainPage mainPage = new MainPage(homePage); 
} 

를 선언 또는

private void createAndShowGUI() { 
    MainPage mainPage = new MainPage(HomePage.this); 
}