我喜欢将滚动条添加到FlowLayout
的JPanel
,但这是不可能的,我没有看到滚动条。
我已经尝试了一千种不同的方法,但我什么都没有完成。我对java相当陌生,我有很多失败,所以请友好。
下面是我的代码://Creamos el panel que contendra los botones de cada producto diferente
package com.foolsrecords.tpv.tablaproductos.vista;
//Hacemos todas las importaciones necesarias
import com.foolsrecords.tpv.modelo.Producto;
import com.foolsrecords.tpv.modelo.eventos.ControladorEventListener;
import com.foolsrecords.tpv.modelo.eventos.ProductoSeleccionadoListener;
import com.foolsrecords.tpv.servicios.ServicioItemVenta;
import com.foolsrecords.tpv.servicios.ServicioProducto;
import com.foolsrecords.tpv.vista.componentes.JProductoButton;
import java.awt.Color;
import java.awt.Image;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.swing.SwingConstants;
import javax.swing.UIManager;
//Creamos la clase principal
public class TablaProductos extends javax.swing.JPanel {
//Creamos las variables y objetos necesarios para poder trabajar
private Map<Integer, JProductoButton> mapaProductos;
ProductoSeleccionadoListener objEven = new ProductoSeleccionadoListener(this);
ServicioItemVenta servItemVenta = new ServicioItemVenta();
//Creamos el constructor
public TablaProductos() {
initComponents();
inicializarPanelProductos(0); //con los subproductos de tipo 1
}
//Inicializamos el panel de productos y le pasamos la familia de los productos como parametro para mostrar los botones correctos
public void inicializarPanelProductos(int tipoProducto) {
//Creamos un objeto para conectar con la base de datos a traves de la clase servicioproducto
ServicioProducto servicio = new ServicioProducto();
//Conectamos con la base de datos y cojemos los productos de la familia enviada como parametro
List<Producto> productos = servicio.getProductos(tipoProducto);
//Creamos un mapaproductos para poder crear los botones dinamicamente
mapaProductos = new HashMap();
//Borramos el panel jpanelproductos para montarlo de nuevo como nosotros queremos
jpanelProductos.removeAll();
//Creamos los 15 botones que contendra el panel y los hacemos todos invisibles
for (int i = 1; i <= 30; i++) {
mapaProductos.put(i, new JProductoButton());
mapaProductos.get(i).addActionListener(objEven);
mapaProductos.get(i).setVisible(false);
jpanelProductos.add(mapaProductos.get(i), i - 1);
}
//Hacemos visibles tantos botones como productos tenemos en la familia enviada como parametro
for (int i = 0; i < productos.size(); i++) {
JProductoButton boton = mapaProductos.get(i + 1);
UIManager.put("Button.select", Color.WHITE);
boton.setVisible(true);
boton.setProducto(productos.get(i));
boton.setHorizontalTextPosition(SwingConstants.CENTER);
boton.setVerticalTextPosition(SwingConstants.BOTTOM);
boton.setFocusPainted(false);
boton.setBackground(Color.WHITE);
boton.setFont(new java.awt.Font("Arial", 1, 9));;
boton.setText(productos.get(i).getDescripcion());
boton.setIcon(new javax.swing.ImageIcon(productos.get(i).getImagen().getScaledInstance(88, 70, Image.SCALE_SMOOTH)));
boton.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 204), 2));
boton.setPreferredSize(new java.awt.Dimension(79, 97));
boton.setMinimumSize(new java.awt.Dimension(79, 97));
boton.setMaximumSize(new java.awt.Dimension(79, 97));
}
jpanelProductos.repaint();
}
//Este metodo es generado automaticamente por netbeans
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
jPanel1 = new javax.swing.JPanel();
jScrollPane2 = new javax.swing.JScrollPane();
jpanelProductos = new javax.swing.JPanel();
setMinimumSize(new java.awt.Dimension(410, 300));
setName(""); // NOI18N
setPreferredSize(new java.awt.Dimension(410, 300));
setLayout(null);
jPanel1.setPreferredSize(new java.awt.Dimension(410, 300));
jPanel1.setLayout(null);
jpanelProductos.setPreferredSize(new java.awt.Dimension(400, 800));
jpanelProductos.setLayout(new java.awt.FlowLayout(java.awt.FlowLayout.LEFT, 2, 2));
jScrollPane2.setViewportView(jpanelProductos);
jPanel1.add(jScrollPane2);
jScrollPane2.setBounds(0, 0, 410, 300);
add(jPanel1);
jPanel1.setBounds(0, 0, 410, 300);
}// </editor-fold>
// Variables declaration - do not modify
private javax.swing.JPanel jPanel1;
private javax.swing.JScrollPane jScrollPane2;
private javax.swing.JPanel jpanelProductos;
// End of variables declaration
//Creamos los get y los set necesarios
public javax.swing.JPanel getJpanelProductos() {
return jpanelProductos;
}
public void setJpanelProductos(javax.swing.JPanel jpanelProductos) {
this.jpanelProductos = jpanelProductos;
}
public void setControlador(ControladorEventListener controlador) {
this.objEven.setControlador(controlador);
}
}
这个…
jpanelProductos.setPreferredSize(new java.awt.Dimension(400, 800));
是你的问题。JScrollPane
将使用组件的首选大小来确定是否需要使用滚动条来显示它。您应该让布局管理器做出此决定。
如果你想影响视口的大小(滚动面板默认显示的大小),那么你应该使用Scrollable
interface
我应该避免使用set(Preferred|Maximum|Minimum)Size方法在Java Swing?查看详细信息。
避免使用null
布局,像素完美的布局在现代ui设计中是一种错觉。影响组件大小的因素太多了,没有一个是你能控制的。Swing被设计成以布局管理器为核心,丢弃这些将导致没完没了的问题和问题,您将花费越来越多的时间来纠正
谢谢大家,代码现在正在工作,我删除了所有的代码,并使所有的新的,现在所有的工作,这是我的新代码:
//Creamos el panel que contendra los botones de cada producto diferente
package com.foolsrecords.tpv.tablaproductos.vista;
//Hacemos todas las importaciones necesarias
import com.foolsrecords.tpv.modelo.Producto;
import com.foolsrecords.tpv.modelo.eventos.ControladorEventListener;
import com.foolsrecords.tpv.modelo.eventos.ProductoSeleccionadoListener;
import com.foolsrecords.tpv.servicios.ServicioItemVenta;
import com.foolsrecords.tpv.servicios.ServicioProducto;
import com.foolsrecords.tpv.vista.componentes.JProductoButton;
import java.awt.Color;
import java.awt.Image;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.swing.SwingConstants;
import javax.swing.UIManager;
//Creamos la clase principal
public class TablaProductos extends javax.swing.JPanel {
//Creamos las variables y objetos necesarios para poder trabajar
private Map<Integer, JProductoButton> mapaProductos;
ProductoSeleccionadoListener objEven = new ProductoSeleccionadoListener(this);
ServicioItemVenta servItemVenta = new ServicioItemVenta();
//Creamos el constructor
public TablaProductos() {
initComponents();
inicializarPanelProductos(0); //con los subproductos de tipo 1
}
//Inicializamos el panel de productos y le pasamos la familia de los productos como parametro para mostrar los botones correctos
public void inicializarPanelProductos(int tipoProducto) {
//Creamos un objeto para conectar con la base de datos a traves de la clase servicioproducto
ServicioProducto servicio = new ServicioProducto();
//Conectamos con la base de datos y cojemos los productos de la familia enviada como parametro
List<Producto> productos = servicio.getProductos(tipoProducto);
//Creamos un mapaproductos para poder crear los botones dinamicamente
mapaProductos = new HashMap();
//Borramos el panel jpanelproductos para montarlo de nuevo como nosotros queremos
jpanelProductos.removeAll();
//Creamos los 15 botones que contendra el panel y los hacemos todos invisibles
for (int i = 1; i < productos.size()+2; i++) {
mapaProductos.put(i, new JProductoButton());
mapaProductos.get(i).addActionListener(objEven);
mapaProductos.get(i).setVisible(false);
jpanelProductos.add(mapaProductos.get(i), i - 1);
}
//Hacemos visibles tantos botones como productos tenemos en la familia enviada como parametro
for (int i = 0; i < productos.size(); i++) {
JProductoButton boton = mapaProductos.get(i + 1);
UIManager.put("Button.select", Color.WHITE);
boton.setVisible(true);
boton.setProducto(productos.get(i));
boton.setHorizontalTextPosition(SwingConstants.CENTER);
boton.setVerticalTextPosition(SwingConstants.BOTTOM);
boton.setFocusPainted(false);
boton.setBackground(Color.WHITE);
boton.setFont(new java.awt.Font("Arial", 1, 9));;
boton.setText(productos.get(i).getDescripcion());
boton.setIcon(new javax.swing.ImageIcon(productos.get(i).getImagen().getScaledInstance(88, 70, Image.SCALE_SMOOTH)));
boton.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 204), 2));
boton.setPreferredSize(new java.awt.Dimension(76, 97));
boton.setMinimumSize(new java.awt.Dimension(76, 97));
boton.setMaximumSize(new java.awt.Dimension(76, 97));
}
jpanelProductos.repaint();
}
//Este metodo es generado automaticamente por netbeans
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
jScrollPane2 = new javax.swing.JScrollPane();
jpanelProductos = new javax.swing.JPanel();
setMinimumSize(new java.awt.Dimension(410, 300));
setName(""); // NOI18N
setPreferredSize(new java.awt.Dimension(410, 300));
setLayout(null);
jpanelProductos.setPreferredSize(new java.awt.Dimension(350, 2000));
jpanelProductos.setLayout(new java.awt.FlowLayout(java.awt.FlowLayout.LEFT, 2, 2));
jScrollPane2.setViewportView(jpanelProductos);
add(jScrollPane2);
jScrollPane2.setBounds(0, 0, 410, 300);
}// </editor-fold>
// Variables declaration - do not modify
private javax.swing.JScrollPane jScrollPane2;
private javax.swing.JPanel jpanelProductos;
// End of variables declaration
//Creamos los get y los set necesarios
public javax.swing.JPanel getJpanelProductos() {
return jpanelProductos;
}
public void setJpanelProductos(javax.swing.JPanel jpanelProductos) {
this.jpanelProductos = jpanelProductos;
}
public void setControlador(ControladorEventListener controlador) {
this.objEven.setControlador(controlador);
}
public javax.swing.JScrollPane getjScrollPane2() {
return jScrollPane2;
}
public void setjScrollPane2(javax.swing.JScrollPane jScrollPane2) {
this.jScrollPane2 = jScrollPane2;
}
}