【问题标题】:Adding scrollbar to FlowLayout将滚动条添加到 FlowLayout
【发布时间】:2014-08-17 22:42:13
【问题描述】:

我喜欢用FlowLayoutJPanel 添加滚动条,但这是不可能的,我看不到滚动条。

我已经尝试了一千种不同的方法,但我没有完成任何事情。 我对 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);
}
}

【问题讨论】:

  • FlowLayout 不包装其内容(很好)。你最好使用另一个布局管理器,比如 WrapLayout 或许
  • 我试过 wraplayout 但还是不行,我没有滚动条。感谢您的回答。

标签: java swing jpanel jscrollpane flowlayout


【解决方案1】:

这...

jpanelProductos.setPreferredSize(new java.awt.Dimension(400, 800));

是你的问题。 JScrollPane 将使用组件的首选大小来确定是否需要使用滚动条来显示它。您应该让布局管理器做出此决定。

如果你想影响视口的大小(滚动窗格默认显示多大),那么你应该使用Scrollableinterface

查看Should I avoid the use of set(Preferred|Maximum|Minimum)Size methods in Java Swing? 了解更多详情。

避免使用null 布局,像素完美的布局是现代用户界面设计中的一种错觉。影响组件单个尺寸的因素太多,您无法控制。 Swing 旨在与核心的布局管理器一起工作,丢弃这些将导致无穷无尽的问题和问题,您将花费越来越多的时间来尝试纠正

【讨论】:

  • 我用getPreferedSize() 测试过,什么都没有,拉不到滚动条,可能是我做错了什么。我看过你给我的消息,我一遍又一遍地阅读,但不知道如何显示卷轴。我之前说过我对java很陌生。你能指导我多一点吗??你能给我更多的信息吗?
【解决方案2】:

谢谢大家,代码现在可以运行了,我删除了所有代码并重新生成了所有代码,现在一切正常,这是我的新代码:

//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;
}

}

【讨论】:

  • 这是一个不同的问题。您应该就滚动条的可见性提出一个单独的问题。我从你的回答中删除了这部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-20
  • 2013-10-25
  • 2013-01-24
相关资源
最近更新 更多