Bileşenleri dinamik olarak eklemem gerekiyor. Ayrıca, düzeni dinamik olarak değiştirmem gerekiyor.Java Swing: GUI'yi dinamik olarak değiştirme
6
A
cevap
13
Referans için,temel yöntemini gösteren bir sscce. Daha ayrıntılı olan bu example her iki gereksinimi de gösterir: düzeni değiştirir ve bileşenleri dinamik olarak ekler. Dinamik düzenini değiştirmenin
import java.awt.*;
import java.awt.event.ActionEvent;
import javax.swing.*;
/** @see http://stackoverflow.com/questions/5750068 */
public class DynamicLayout extends JPanel {
private static final LayoutManager H = new GridLayout(1, 0);
private static final LayoutManager V = new GridLayout(0, 1);
public DynamicLayout() {
this.setLayout(H);
this.setPreferredSize(new Dimension(320, 240));
for (int i = 0; i < 3; i++) {
this.add(new JLabel("Label " + String.valueOf(i), JLabel.CENTER));
}
}
private void display() {
JFrame f = new JFrame("DynamicLayout");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.add(this);
JPanel p = new JPanel();
p.add(new JButton(new AbstractAction("Horizontal") {
@Override
public void actionPerformed(ActionEvent e) {
DynamicLayout.this.setLayout(H);
DynamicLayout.this.validate();
}
}));
p.add(new JButton(new AbstractAction("Vertical") {
@Override
public void actionPerformed(ActionEvent e) {
DynamicLayout.this.setLayout(V);
DynamicLayout.this.validate();
}
}));
f.add(p, BorderLayout.SOUTH);
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new DynamicLayout().display();
}
});
}
}
1
Örnek:
package swinglayout;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class LayoutChanger implements ActionListener{
JButton b1;
JButton b2;
JButton b3;
JButton b4;
JButton b5;
JButton b6;
/** This button set the flowlayout on panel2 with left orientation */
JButton flowLayout;
/** This button set the Gridlayout of 2,3 grid on panel2 */
JButton gridLayout;
/** This button set the Borderlayout on panel2*/
JButton borderLayout;
/**
* This panel is control panel where we use button to change
* layout of another panel
*/
JPanel panel;
/** This panel contain multiple button from b1 to b6 */
JPanel panel2;
JFrame frame;
public LayoutChanger() {
//set Default Look and Feel on frame
JFrame.setDefaultLookAndFeelDecorated(true);
frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container con = frame.getContentPane();
con.setLayout(new BorderLayout());
panel = new JPanel();
panel2 = new JPanel();
//This button are used to only showing the layout effect
b1 = new JButton("HelloButton1");
b2 = new JButton("HelloButton2");
b3 = new JButton("HelloButton3");
b4 = new JButton("HelloButton4");
b5 = new JButton("HelloButton5");
b6 = new JButton("HelloButton6");
// By default panel have layout
panel2.add(b1);
panel2.add(b2);
panel2.add(b3);
panel2.add(b4);
panel2.add(b5);
panel2.add(b6);
// Layout changer button
flowLayout = new JButton("FlowLayout");
gridLayout = new JButton("GridLayout");
borderLayout = new JButton("BorderLayout");
//call Action listener on every layout changer button
flowLayout.addActionListener(this);
gridLayout.addActionListener(this);
borderLayout.addActionListener(this);
panel.add(flowLayout);
panel.add(gridLayout);
panel.add(borderLayout);
// add layout changer button panel at a top
//button panel at the center of container
con.add(panel, BorderLayout.PAGE_START);
con.add(panel2, BorderLayout.CENTER);
frame.setVisible(true);
frame.pack();
}
public void actionPerformed(ActionEvent e) {
//set the flowlayout on panel2
if(e.getSource() == flowLayout) {
FlowLayout flow = new FlowLayout(FlowLayout.LEFT);
panel2.setLayout(flow);
panel2.validate();
}
//set the gridlayout on panel2
if(e.getSource() == gridLayout) {
GridLayout grid = new GridLayout(2,3);
panel2.setLayout(grid);
panel2.validate();
}
//set the gridlayout but the problem if we don't set the constraint
//all button are set on center. So you remove the all button from panel
//Then set grid layout on panel and add them with constraints.
if(e.getSource() == borderLayout) {
panel2.remove(b1);
panel2.remove(b2);
panel2.remove(b3);
panel2.remove(b4);
panel2.remove(b5);
panel2.remove(b6);
BorderLayout border = new BorderLayout();
panel2.setLayout(border);
panel2.add(b1,BorderLayout.NORTH);
panel2.add(b2,BorderLayout.SOUTH);
panel2.add(b3,BorderLayout.EAST);
panel2.add(b4,BorderLayout.WEST);
panel2.add(b5,BorderLayout.CENTER);
panel2.add(b6,BorderLayout.BEFORE_FIRST_LINE);
panel2.validate();
}
}
public static void main(String args[]) {
new LayoutChanger();
}
}
Bir şey hatırlamak Bu yöntemi demiyorlar panel.If üzerinde yöntemini validate()
çağırmak unuttum yok sen panelde yeni düzen ayarlamak olduğunu Düzenlemede değişimin etkisini görmüyorsunuz. Efekti ile yöntemi görmek istiyorsanız yöntemi çağırın, çerçeveyi yeniden boyutlandırmalısınız. sonra kısıtlaması
İlgili konular
- 1. Dinamik olarak JLabel'i değiştirme
- 2. Java Swing - çalışma zamanında dinamik olarak yerel ayarları değiştir
- 3. Etiket metnini dinamik olarak Java'da güncelleştirme Swing
- 4. Java Swing Sorunu
- 5. Omurga dinamik olarak şablonları değiştirme
- 6. javafx: stili dinamik olarak bölmede değiştirme
- 7. Java Swing düğmesi renkleri
- 8. Java Swing: Focus issue
- 9. Java Swing Metin Düzenleyici
- 10. Dinamik olarak PHP'de bir işlevle değiştirme
- 11. Mysql içinde alan sırasını dinamik olarak değiştirme
- 12. Wpf penceresinde dinamik olarak içerik değiştirme
- 13. Highcharts veri serisini dinamik olarak değiştirme
- 14. Ortak kutu rengini dinamik olarak değiştirme wpf
- 15. Django formları: help_text'i dinamik olarak değiştirme
- 16. Android - Parça yerleşim düzenini dinamik olarak değiştirme
- 17. Java Swing Layouts'ta hata ayıklama
- 18. Java - Dinamik olarak yükleme sınıfları
- 19. Bir Java Swing programı için görev çubuğu simgesinin dinamik olarak etkinleştirilmesi veya devre dışı bırakılması
- 20. Clojure'da Java Swing sınıfını genişletme
- 21. Google Map in JAVA Swing
- 22. Temel Java Swing yazılım kurulumu
- 23. Özel tasarım JScollPane Java Swing
- 24. Java Swing BoxLayout ignoring AlignmentX
- 25. XChartPanel yapıcımın (Java Swing) nesi var? Hata olarak gösterilir
- 26. Swing paketi C#
- 27. Java Swing uygulamasının iyi bir örneği nedir?
- 28. JLabel'de metin oluşturma dinamik olarak yeniden boyutlandırma
- 29. Java Sınıfı Yapıcı parametresi ile dinamik olarak
- 30. Bir örneğin jenerik türünü dinamik olarak java
ben tarafından panelde bileşen eklemek Ayrıca çok kolay
FlowLayout
,GridLayout
veBoxLayout
ancak setBorderLayout
o elemanı eklemek için kısıtlamalar gerekli gibi aynı düzeni ayarlayabilirsiniz, bu yüzden ilkremove(Component comp)
yöntemle panelinden bütün bileşeni kaldırmak Bunu yapmak için size bol şans dilemek için hep konuştuğumu düşünüyorum! Swing ile yapabilmeli, ama her şeyde olduğu gibi, şeytanın detaylarında. Düzen yöneticileri ile ilgili eğiticileri okudunuz mu? Denediğiniz kodla ilgili herhangi bir sorunuz veya sorununuz var mı? Mevcut sorununuza, bize yardım etmemize yardımcı olacağını anlatabileceğiniz herhangi bir detay var mı? Ne yazık ki, sorulan soru, belirli bir cevabı vermek için çok genel. –