Sziasztok!
Írni szeretnék egy olyan Java programot, amiben több nyomógomb jelenik meg FlowLayout elrendezésben.
Sok gomb esetén szeretném, ha függőlegesen görgető sáv segítségével görgetni lehetne a gombok mezejében.
A mostani állapot esetén az a bajom, hogy a gombok nem jelennek meg úgy, ahogy azt elvárná az ember egy FlowLayout elrendezéstől. A gombok egy vízszintes vonalban jelennek meg, a keret szélén nem törik meg a sor, ahogy szeretném. Ezáltal nem is lehet görgetni függőlegesen.
Az alábbiakban közlöm a forráskódot. Ha van véleményetek, ne rejtsétek el! Kösz.
import java.awt.*;
import javax.swing.*;
public class MyLayout {
static JFrame myFrame = new JFrame("My Buttons");
static int num = 10;
public static void main(String[] args) {
myFrame.setSize(400, 300);
myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
BorderLayout border = new BorderLayout();
myFrame.setLayout(border);
JPanel panel = new JPanel();
FlowLayout flow = new FlowLayout(FlowLayout.LEFT, 8, 8);
panel.setLayout(flow);
if (num >= 0) {
for (int i = 0; i < num; i++) {
try {
JButton button = new JButton("Nyomógomb" + (i+1));
panel.add(button);
}
catch (Exception e) {
e.printStackTrace();
}
}
}
JScrollPane scroll = new JScrollPane(panel,
JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
JScrollPane.HORIZONTAL_SCROLLBAR_NEVER
);
myFrame.add(scroll, BorderLayout.CENTER);
myFrame.setVisible(true); }
}
- 1276 megtekintés
Hozzászólások
Ez az, amit keresel?
- A hozzászóláshoz be kell jelentkezni
Nem ez kell. Nincs benne görgetési lehetőség.
Kösz!
- A hozzászóláshoz be kell jelentkezni
Tényleg nem vagyok Java-guru, de ha a multiline megvan, akkor onnantól kezdve már csak bele kell dobni egy JScrollPane-be és van görgő is, vagy tévedek?
- A hozzászóláshoz be kell jelentkezni
Sajnos ebben az esetben is, amikor "beledobom" a panelt egy JScrollPane-be, akkor ugyanaz történik, mint, amit leírtam. Egy sorba kerülnek a gombok, és nincs függőleges görgetési lehetőség.
Korábban nem írtam, de érdekes módon vízszintesen lehet görgetni a panelt, ha a görgető objektumnál beállítom a vízszintes görgetést. A te példádban is, és az én programomban is.
- A hozzászóláshoz be kell jelentkezni
Hello
egy pár dolog hiányzik
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
public class MyLayout {
static JFrame myFrame = new JFrame("My Buttons");
static final int NUM = 10;
public static void main(String[] args) {
myFrame.setSize(300, 110);
myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container pane = myFrame.getContentPane();
pane.setLayout(new BorderLayout());
JPanel panel = new JPanel();
panel.setPreferredSize(new Dimension(270,110));
panel.setLayout(new FlowLayout());
if (NUM > 0) {
for (int i = 0; i < NUM; i++) {
JButton button = new JButton("Nyomógomb" + (i+1));
panel.add(button);
}
}
JScrollPane scroll = new JScrollPane(panel);
scroll.setAutoscrolls(true);
pane.add(scroll, BorderLayout.CENTER);
myFrame.setVisible(true);
}
}
JFrame-nek szokás elkérni a ContentPane-jét és arra felhelyezni a dolgokat. Először jön a ScrollPane és arra dobod fel a panelt, majd megadod a panel (Flow)layout-ját. Ha kész akkor a scrollpane-t feldobod a contentpane-re. Google-n utánanézel "java pane" címszó alatt biztos találsz tutorialt ami elmagyarázza a frame pane modeljét (mivel nem csak egy pane van neki). Amit bemásoltam még nem teljes mivel ahhoz hogy flow "megtörjön" ahhoz bekell "szorítani" az aktuális ablakméretek közé. Tehát nincs teljesen megoldva, de szerintem eltudsz indulni ezen a vonalon.
Érdemes a Jframe-et egy külön class-ba rakni ami a jframe subclass-a.
Remélem valamit tudtam segíteni.
- A hozzászóláshoz be kell jelentkezni
Hálás köszönet kispista!
Jó a programod. Betettem a setPreferredSize() utasítást az én programomba is. És csodálatos módon az is jó lett.
- A hozzászóláshoz be kell jelentkezni
Azért így is van ezzel probléma: A scrollozás nem a panel tartalmától függ, hanem a setPreferredSize-ban megadott méretektől.
Tfh. éppen minden belefér a panelba és nincs scrollbar. A függőleges méreteket változatlanul hagyva lekeskenyítem az ablakot. A tartalom újratördelődik, és a keskenyebb ablakból mostmár alul kilóg. Mégsem jelenik meg a függőleges scrollbar.
Ha a panel helyett egy textareat nézünk, abban a szöveg hasonlóan tördelődik, mint a panelban a gombok. A textareaban levő scrollbar ráadásul "tudja", hogy meddig ér benne a szöveg. Ezt a viselkedést kéne elérni a panellel is.
--
CCC3
- A hozzászóláshoz be kell jelentkezni
Való igaz, nem egyszerű a helyzet.
Jelenleg úgy oldottam meg a problémát, hogy a keretet fix méretűre vettem, és a benne lévő panel függőleges méretét ráhagyással kiszámolom a benne lévő gombok száma alapján, és azt adom meg a setPreferredSize() függvényben. Így azt a viselkedést kapom, amit szeretnék. Tehát minden nyomógomb FlowLayout elrendezésben felkerül a panelre, függőleges görgetősávval görgethető, és minden gomb hozzáférhető 100%-osan.
- A hozzászóláshoz be kell jelentkezni