2012-12-13 2 views
2

변경된 내용으로 Java 프레임을 업데이트하는 방법은 무엇입니까?프레임 업데이트 또는 패널 다시 확인/다시 칠

업데이트 된 내용으로 프레임 또는 패널 만 업데이트하려고합니다. 무엇을이 용도로 사용합니까?

여기 프레임을 다시 확인하거나 주 패널이나 다른 무엇이 작동하는지 다시 채우려는 곳입니다. 많은 것들을 시도했지만 그 중 아무 것도 작동하지 않았습니다.

public void actionPerformed(ActionEvent e) { 
     //System.out.println(e.getActionCommand()); 
     if (e.getActionCommand().equals("advance")) { 
      multi--; 
        // Revalidate update repaint here <<<<<<<<<<<<<<<<<<< 
     } 
     else if (e.getActionCommand().equals("reverse")) { 
      multi++; 
        // Revalidate update repaint here <<<<<<<<<<<<<<<<<<<  
     } 
     else { 
      openURL(e.getActionCommand()); 
     } 

     } 

다음은 전체 자바 파일

/* 
* 
* 
*/ 

package build; 

import java.lang.reflect.Method; 
import javax.swing.JOptionPane; 
import java.util.Arrays; 
import java.util.*; 
import java.util.ArrayList; 

import javax.swing.*; 
import javax.swing.AbstractButton; 
import javax.swing.JScrollPane; 
import javax.swing.JButton; 
import javax.swing.JPanel; 
import javax.swing.JFrame; 
import javax.swing.ImageIcon; 

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

/* 
* ButtonDemo.java requires the following files: 
* images/right.gif 
* images/middle.gif 
* images/left.gif 
*/ 
public class StockTable extends JPanel 
         implements ActionListener { 
    static int multi = 1; 
    int roll = 0; 
    static TextVars textvars = new TextVars(); 
    static final String[] browsers = { "firefox", "opera", "konqueror", "epiphany", 
      "seamonkey", "galeon", "kazehakase", "mozilla", "netscape" }; 
    JFrame frame; 
    JPanel mainpanel, panel1, panel2, panel3, panel4, panel2left, panel2center, panel2right; 
     JButton stknames_btn[] = new JButton[textvars.getNumberOfStocks()]; 
    JLabel label[] = new JLabel[textvars.getNumberOfStocks()]; 
    JLabel headlabel, dayspan, namelabel; 
    JRadioButton radioButton; 
    JButton button; 
    JScrollPane scrollpane; 
    int wid = 825; 
    public JPanel createContentPane() { 

     mainpanel = new JPanel(); 
     mainpanel.setPreferredSize(new Dimension(wid, 800)); 
     mainpanel.setLayout(new GridBagLayout()); 
     GridBagConstraints c = new GridBagConstraints(); 
     panel1 = new JPanel(); 
     panel1.setPreferredSize(new Dimension(wid, 25)); 
     c.gridx = 0; 
     c.gridy = 0; 
     c.insets = new Insets(0,0,0,0); 
     mainpanel.add(panel1, c); 

     // Panel 2------------ 
     panel2 = new JPanel(); 
     panel2.setPreferredSize(new Dimension(wid, 51)); 
     c.gridx = 0; 
     c.gridy = 1; 
     c.insets = new Insets(0,0,0,0); 
     mainpanel.add(panel2, c); 
     panel2left = new JPanel(); 
     panel2left.setPreferredSize(new Dimension(270, 51)); 
     c.gridx = 0; 
     c.gridy = 1; 
     c.insets = new Insets(0,0,0,0); 
     panel2.add(panel2left, c); 
     panel2center = new JPanel(); 
     panel2center.setPreferredSize(new Dimension(258, 51)); 
     c.gridx = 1; 
     c.gridy = 1; 
     c.insets = new Insets(0,0,0,0); 
     panel2.add(panel2center, c); 
     panel2right = new JPanel(); 
     panel2right.setPreferredSize(new Dimension(270, 51)); 
     c.gridx = 2; 
     c.gridy = 1; 
     c.insets = new Insets(0,0,0,0); 
     panel2.add(panel2right, c); 
     // ------------------ 

     panel3 = new JPanel(); 
     panel3.setLayout(new GridBagLayout()); 
     scrollpane = new JScrollPane(panel3); 
     scrollpane.setPreferredSize(new Dimension(wid, 675)); 
     c.gridx = 0; 
     c.gridy = 2; 
     c.insets = new Insets(0,0,0,0); 
     mainpanel.add(scrollpane, c); 


      ImageIcon leftButtonIcon = createImageIcon("images/right.gif"); 

      //b1 = new JButton("Disable middle button", leftButtonIcon); 
      //b1.setVerticalTextPosition(AbstractButton.CENTER); 
      //b1.setHorizontalTextPosition(AbstractButton.LEADING); //aka LEFT, for left-to-right locales 
      //b1.setMnemonic(KeyEvent.VK_D); 
      //b1.setActionCommand("disable"); 


      //Listen for actions on buttons 1 
      //b1.addActionListener(this); 

      //b1.setToolTipText("Click this button to disable the middle button."); 

      //Add Components to this container, using the default FlowLayout. 
      //add(b1); 


     headlabel = new JLabel("hellorow1"); 
      c.gridx = 0;  
      c.gridy = 0;  
     c.insets = new Insets(0, 0, 0, 0); 
     panel1.add(headlabel, c); 

     radioButton = new JRadioButton("Percentage"); 
      c.gridx = 2;  
      c.gridy = 0;  
     c.insets = new Insets(0, 0, 0, 0); 
     panel1.add(radioButton, c); 

     radioButton = new JRadioButton("Days Range"); 
      c.gridx = 3;  
      c.gridy = 0;  
     c.insets = new Insets(0, 0, 0, 0); 
     panel1.add(radioButton, c); 

     radioButton = new JRadioButton("Open/Close"); 
      c.gridx = 4;  
      c.gridy = 0;  
     c.insets = new Insets(0, 0, 0,0); 
     panel1.add(radioButton, c); 


     button = new JButton("<<"); 
     button.setPreferredSize(new Dimension(50, 50)); 
     button.setActionCommand("reverse"); 
     button.addActionListener(this); 
      c.gridx = 0;  
      c.gridy = 1;  
     c.insets = new Insets(0, 0, 0, 0); 
      panel2left.add(button, c); 

     dayspan = new JLabel("hellorow2"); 
     dayspan.setHorizontalAlignment(JLabel.CENTER); 
     dayspan.setVerticalAlignment(JLabel.CENTER); 
     dayspan.setPreferredSize(new Dimension(270, 50)); 
      c.gridx = 1;  
      c.gridy = 1; 
     c.insets = new Insets(0, 0, 0, 0);  
      panel2center.add(dayspan, c); 

     button = new JButton(">>"); 
     button.setPreferredSize(new Dimension(50, 50)); 
     button.setActionCommand("advance"); 
     button.addActionListener(this); 
     if (multi == 0) { 
      button.setEnabled(false); 
     } 
     else { 
      button.setEnabled(true); 
     } 
      c.gridx = 2;  
      c.gridy = 1;  
     c.insets = new Insets(0, 0, 0, 0); 
      panel2right.add(button, c); 

     int availSpace_int = textvars.getStocks().size()-textvars.getNumberOfStocks()*7; 

     ArrayList<String[]> stocknames = textvars.getStockNames(); 
     ArrayList<String[]> stocks = textvars.getStocks(); 
     for (int column = 0; column < 8; column++) { 
      for (int row = 0; row < textvars.getNumberOfStocks(); row++) { 

       if (column==0) { 
        if (row==0) { 
         namelabel = new JLabel(stocknames.get(0)[0]); 
         namelabel.setVerticalAlignment(JLabel.CENTER); 
         namelabel.setHorizontalAlignment(JLabel.CENTER); 
         namelabel.setPreferredSize(new Dimension(100, 25)); 
         c.gridx = column; 
         c.gridy = row; 
         c.insets = new Insets(0, 0, 0, 0); 
         panel3.add(namelabel, c); 
        } 
        else { 
         stknames_btn[row] = new JButton(stocknames.get(row)[0], leftButtonIcon); 
         stknames_btn[row].setVerticalTextPosition(AbstractButton.CENTER); 
         stknames_btn[row].setActionCommand(stocknames.get(row)[1]); 
         stknames_btn[row].addActionListener(this); 
         stknames_btn[row].setToolTipText("go to Google Finance "+stocknames.get(row)[0]); 
         stknames_btn[row].setPreferredSize(new Dimension(100, 25)); 
         c.gridx = column; 
         c.gridy = row; 
         c.insets = new Insets(0, 0, 0, 0); 
         //scrollpane.add(stknames[row], c); 
         panel3.add(stknames_btn[row], c); 
        } 
       } 
       else { 
         label[row]= new JLabel(textvars.getStocks().get(columnMulti(multi))[1]); 
         label[row].setBorder(BorderFactory.createLineBorder(Color.black)); 
         label[row].setVerticalAlignment(JLabel.CENTER); 
         label[row].setHorizontalAlignment(JLabel.CENTER); 
         label[row].setPreferredSize(new Dimension(100, 25));  
         c.gridx = column; 
         c.gridy = row; 
         c.insets = new Insets(0,0,0,0); 
         panel3.add(label[row], c); 
       } 

      } 
     } 

     return mainpanel; 
     } 

     public void actionPerformed(ActionEvent e) { 
     //System.out.println(e.getActionCommand()); 
     if (e.getActionCommand().equals("advance")) { 
      multi--; 
     } 
     else if (e.getActionCommand().equals("reverse")) { 
      multi++;   
     } 
     else { 
      openURL(e.getActionCommand()); 
     } 

     } 

     /** Returns an ImageIcon, or null if the path was invalid. */ 
     protected static ImageIcon createImageIcon(String path) { 
      java.net.URL imgURL = StockTable.class.getResource(path); 
      if (imgURL != null) { 
        return new ImageIcon(imgURL); 
      } else { 
        System.err.println("Couldn't find file: " + path); 
        return null; 
      } 
     } 

    public static void openURL(String url) { 
     String osName = System.getProperty("os.name"); 
     try { 
      if (osName.startsWith("Mac OS")) { 
       Class<?> fileMgr = Class.forName("com.apple.eio.FileManager"); 
       Method openURL = fileMgr.getDeclaredMethod("openURL", 
        new Class[] {String.class}); 
       openURL.invoke(null, new Object[] {url}); 
         } 
      else if (osName.startsWith("Windows")) {  
       Runtime.getRuntime().exec("rundll32 url.dll,FileProtocolHandler " + url); 
      } 
      else { //assume Unix or Linux 
       boolean found = false; 
       for (String browser : browsers) 
        if (!found) { 
         found = Runtime.getRuntime().exec(
         new String[] {"which", browser}).waitFor() == 0; 
         if (found) 
          Runtime.getRuntime().exec(new String[] {browser, url}); 
        } 
        if (!found) 
         throw new Exception(Arrays.toString(browsers)); 
        } 
       } 
     catch (Exception e) { 
      JOptionPane.showMessageDialog(null, 
       "Error attempting to launch web browser\n" + e.toString()); 
     } 
    } 
    int reit = 0; 
    int start = textvars.getStocks().size()-((textvars.getNumberOfStocks()*5)*7)-1; 
    public int columnMulti(int multi) { 
     reit++; 
     start++; 
     if (reit == textvars.getNumberOfStocks()) { 
      reit = 0; 
      start=start+64; 
     } 
     //start = start - (multi*(textvars.getNumberOfStocks())); 
     return start; 
    } 

     /** 
     * Create the GUI and show it. For thread safety, 
     * this method should be invoked from the 
     * event-dispatching thread. 
     */ 
     private static void createAndShowGUI() { 

     //Create and set up the window. 
      JFrame frame = new JFrame("Stock Table"); 
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

      //Create and set up the content pane. 
      StockTable newContentPane = new StockTable(); 
      //newContentPane.setOpaque(true); //content panes must be opaque 
      //frame.setContentPane(newContentPane); 
     frame.setContentPane(newContentPane.createContentPane()); 
     frame.setSize(800, 800); 


      //Display the window. 
      frame.pack(); 
      frame.setVisible(true); 


     } 

    public static void main(String[] args) { 
      //Schedule a job for the event-dispatching thread: 
      //creating and showing this application's GUI. 
      javax.swing.SwingUtilities.invokeLater(new Runnable() { 
        public void run() { 
         createAndShowGUI(); 
        } 
      }); 
     } 
} 
+0

정확히 어떤 업데이트 하시겠습니까? – MadProgrammer

+0

변경된 내용으로 메인 패널을 업데이트하고 싶습니다. 처음에는 표시되는 것과 동일하지만 테이블과 라디오 버튼에 대한 다른 번호가 변경되고 설정 및 변경이 advance4 및 reverse 버튼에 대해 변경되었습니다. 기본적으로 createContentPane()을 다시 실행하고 새 프레임 – user1516251

+0

슈퍼를 사용해야합니까, 나는 이것을 수행하는 방법에 대해 명확하지 않습니다. – user1516251

답변

1

자신이 경종을 인상해야한다, 작은 변화를 기반으로 UI를 "다시 작성"하고 싶은 찾을 순간이다. 이것이 좋은 아이디어가 될 상황이 있지만, 대부분의 경우 나쁜 설계의 징조입니다.

의가 시작하자 ...

frame.setContentPane(newContentPane.createContentPane()); 

이 나쁜 생각입니다. 다른 JPanel을 만들려면 JPanel을 만들면됩니다. 갑자기 UI에 컨텍스트가 손실되지 않았습니다. 대신 createContentPane

, 간단한 구조 당신은 StockTable 창의 생성자에서 UI와 같은 ... 더 프레임에 그 추가 ...

frame.setContentPane(newContentPane); 

mainPanel 없애과 StockTable 패널을 사용하여 직접.

코드를 실행할 수는 없지만 테이블 레이아웃을 "에뮬레이트"하는 것처럼 보입니다. 대신 생활을 단순화하고 JTable을 사용하는 법을 배우십시오. 테이블을 업데이트하는 것이 훨씬 쉬워집니다. (더보기 좋게) ...

+1

jtable이 옵션이되었다는 것을 알지 못했습니다. 귀하의 조언을 사용할 것입니다. – user1516251

0

swing component을 항상 업데이트하려면 이벤트 디스패처 스레드를 사용하십시오.

나는이 일이 당신에게 도움이 생각

public void actionPerformed(ActionEvent e) { 
     //System.out.println(e.getActionCommand()); 
     if (e.getActionCommand().equals("advance")) { 
      multi--; 

        Runnable edt = new Runnable() { 
        public void run() { 
         /*Update your components here*/ 
         } 
        }; 

      SwingUtilities.invokeLater(edt); 
      } 
     else if (e.getActionCommand().equals("reverse")) { 
      multi++; 
      Runnable edt= new Runnable() { 
        public void run() { 
         /*Update your components here*/ 
        } 
       }; 

       SwingUtilities.invokeLater(edt); 
     } 
     else { 
      openURL(e.getActionCommand()); 
     } 

     } 
    } 
+0

여기에서 구성 요소를 업데이트/* 여기에서 구성 요소를 업데이트 * /이 if 문을 작성하려면 if (multi == 0) { button.setEnabled (false); } 작업 else { button.setEnabled (true); } – user1516251

+0

mainpanel.removeAll()을 사용하는 경우 주 패널이 첫 번째 방법으로 정보를 다시로드하게 만듭니다. – user1516251