Ufak bir yazılım projesi üzerinde çalışıyorum. Tasarım olarak sol tarafta yukarıdan aşağıya inen butonlar var. Sağ tarafta ise sabit bir panel var. Benim yapmak istediğim şey jtappedPane kullanmadan butonlardan birine tıkladıgımda panel üzerindeki menünün değişmesi.(Mesela personel butonuna tıkladıgımda jpanel üzerinde personel bilgilerinin girildiği ekran gelecek, iş takibi butonuna tıkladıgımda ise iş takip ekranı.) Bunu nasıl gerçekleştirebilirim?alt text

soruldu: 06 Oca '13, 07:54

coder86's gravatar image

coder86
220223035
cevap kabul oranı: 0%

değiştirildi: 06 Oca '13, 08:11

%C3%B6zcanacar's gravatar image

özcanacar ♦♦
17.2k59183183


Eger 2 farkli panel kullaniyorsaniz:

Sol panel = buttonPanel

Sag panel = contentPanel

buttonPanel'den buttonlara tiklandiginda bir metoda gidip, once contentPanel'deki componentleri kaldirin contentPanel.removeAll(), sonra contentPanel.add(ile personelPanel, isTakipPanel veya malzemePanel) den hangisi tiklanmissa onu contentPanel'e ekleyin.

Eger JSplitPane ile yapiyorsaniz:

yukaridaki mantigin aynisini JSplitPane'ye uygulamak icin splitPane.remove(splitPane.getRightComponent()); ile sag componenti kaldirin, splitPane.setRightComponent(personelPanel veya digerleri); ile sag componenti split pane'ye setleyin.

Java Swing tutorials'a bakmanizi tavsiye ederim.

http://docs.oracle.com/javase/tutorial/uiswing/components/panel.html

http://docs.oracle.com/javase/tutorial/uiswing/components/splitpane.html

http://docs.oracle.com/javase/tutorial/uiswing/components/button.html

Update: Kucuk bir demo yazdim, content ve layout'lari anlamaniz icin. Eger standart layout manager'ler ile sorunlar yasiyorsaniz JGoodies Forms veya Miglayout kullanmanizi tavsiye ederim.

alt text


package swingtest;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.UIManager;

/**
 * Dinamic form panels demo
 * 
 * @author cem ikta
 */
public class PanelForm extends JFrame implements ActionListener {

private JPanel buttonPanel;
    private JButton btnPersonel;
    private JButton btnIs;
    private JButton btnMalzeme;
    private JPanel contentPanel;

private JPanel personelPanel;
    private JPanel isPanel;
    private JPanel malzemePanel;

public PanelForm() {
        buildUI();
    }

/**
     * UI islemleri yapilir.
     */
    private void buildUI() {
        // JFrame ayarlari
        setTitle("Panel Form Demo");
        setLayout(new BorderLayout());
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

// buttonPanel ayarlari
        buttonPanel = new JPanel();
        buttonPanel.setLayout(new BoxLayout(buttonPanel, BoxLayout.Y_AXIS));
        buttonPanel.setPreferredSize(new Dimension(300, 300));

btnPersonel = new JButton("Personel");
        btnPersonel.setActionCommand("personel");
        btnPersonel.addActionListener(this);

btnIs = new JButton("Is");
        btnIs.setActionCommand("is");
        btnIs.addActionListener(this);
        btnMalzeme = new JButton("Malzeme");
        btnMalzeme.setActionCommand("malzeme");
        btnMalzeme.addActionListener(this);

buttonPanel.add(btnPersonel);
        buttonPanel.add(btnIs);
        buttonPanel.add(btnMalzeme);

// contentPanel ayarlari
        contentPanel = new JPanel(new BorderLayout());
        contentPanel.setPreferredSize(new Dimension(400, 400));

// personelPanel ayarlari
        personelPanel = new JPanel();
        personelPanel.setLayout(new BoxLayout(personelPanel, BoxLayout.Y_AXIS));
        personelPanel.add(new JLabel("Personel panel content'e eklendi"));
        personelPanel.add(new JLabel("Personel Panel componentleri buraya gelmeli"));

// isPanel ayarlari
        isPanel = new JPanel();
        isPanel.setLayout(new BoxLayout(isPanel, BoxLayout.Y_AXIS));
        isPanel.add(new JLabel("Is panel content'e eklendi"));
        isPanel.add(new JLabel("Is Panel componentleri buraya gelmeli"));

// malzemePanel ayarlari
        malzemePanel = new JPanel();
        malzemePanel.setLayout(new BoxLayout(malzemePanel, BoxLayout.Y_AXIS));
        malzemePanel.add(new JLabel("Malzeme panel content'e eklendi"));
        malzemePanel.add(new JLabel("Malzeme Panel componentleri buraya gelmeli"));

getContentPane().add(buttonPanel, BorderLayout.WEST);
        getContentPane().add(contentPanel, BorderLayout.CENTER);

// layout da degisiklikler yapilinca cagrilmali!
        // yoksa layout kaymalari olabilir.
        pack();

// pack'den sonra verilmeli
        setPreferredSize(new Dimension(800, 600));
    }

/**
     * Button actions
     * 
     * TODO aslinda AbstractAction ile kodlanmali real world projelerde!
     * 
     * @param e action event
     */
    @Override
    public void actionPerformed(ActionEvent e) {
        // JDK7 ile string switch olarak kullanilabilir.
        // JDK6 icin if yazilmali
        switch (e.getActionCommand()) {
            case "personel":
                addPanelToContent(personelPanel);
                break;
            case "is":
                addPanelToContent(isPanel);
                break;
            case "malzeme":
                addPanelToContent(malzemePanel);
                break;
            default:
                break;
        }
    }

/**
     * Verilen paneli content'e ekler.
     * 
     * @param panel content container icin panel
     */
    private void addPanelToContent(JPanel panel) {
        // varsa onceki panel kaldirilir.
        contentPanel.removeAll();

// center'a component eklenir.
        contentPanel.add(panel, BorderLayout.CENTER);

// burasi onemli, bu 2 method cagrilmadan, dinamik eklenen componentler
        // tam gorunmeyebilir, layout tam calismayabilir !!!
        contentPanel.revalidate();
        contentPanel.repaint();

}

/**
     * main 
     * 
     * TODO aslinda real world projede main ayri olmali !
     * 
     * @param args 
     */
    public static void main(String args[]) {
        // laf ayarlari
        try {
            UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
        } catch (Exception e) {
            System.out.println("Look and feel error");
        }

new PanelForm().setVisible(true);
    }

}
permanent link

cevaplandı: 07 Oca '13, 04:22

CemIkta's gravatar image

CemIkta ♦
19.9k29125190
cevap kabul oranı: 36%

değiştirildi: 08 Oca '13, 05:55

hocam bu sekilde(remove/add) daha once bende bi programda kullanmıstım fakat o zaman soyle bi sorun olmustu program calısırken forma bi component eklediğimde formun dizaynı tamamen kayıyor layout larla ne kadar uğrastıysaamda bunu cozememiştim.

(08 Oca '13, 02:43) Sheriff Sheriff's gravatar image
1

Dinamik Layout ve component degisikliklerinde JPanel icin revalidate() ve repaint() metodlarini yeniden cagirmalisiniz!

Ornek kodlar ve aciklamalar ekledim cevaba.

(08 Oca '13, 05:58) CemIkta ♦ CemIkta's gravatar image

Hocam cevabını için ve değerli vaktinizi harcayarak bir örnek hazırladıgınız için cok teşekkür ederim. Sağolun var olun.

(08 Oca '13, 07:40) coder86 coder86's gravatar image
1

Daha once swing ile ilgili detayli aciklamalar burdaki cevapta da verilmisti. Yeni baslayanlar icin:

http://www.btsoru.com/questions/4545/java-swingde-eclipse-source-mu-design-mi

(08 Oca '13, 08:01) CemIkta ♦ CemIkta's gravatar image
Cevabınız
toggle preview

powered by BitNami OSQA