如题,我用Flowlayout装了很多按钮,都是正常排序的,但是加了JScrollPane全都变成一排的,是不是Flowlayout不支持竖项的
JScrollPane,我试过用GridBagLayout,但是貌似还是一样的,添加了JScrollPane就不自动换行了。
求解决方法

解决方案 »

  1.   

    JScrollPane是一个容器,可先设置它的布局,再向其中加入组件,最后窗体容器frame调用add将JScrollPane加入进去
      

  2.   

    JScrollPane可初始化时可设置为自动换行等属性
      

  3.   

    首先,Flowlayout 就是一行为什么会换行呢?那是当可显示区域的宽度小于他的必要大小的时候,会被自动压到下一行去而 JScrollPane 是让面板整个显示出来,所以就不会出现可显示区域的宽度不足的情况,它以滚动条处理了,保证必要的宽度所以你用 JScrollPane 包住这个使用了 Flowlayout 的面板后,就不会换行了,会出现滚动条
      

  4.   

    JScrollPane容器可以用来显示正规内容,当你在没有加JScrollPane的时候,面板的内容正常,是因为空间位置还够容纳的下那些按钮,但是你加了JScrollPane后位置不够了,就不正常了。
    JScrollPane可以把你要显示的面板装起来,然后就会正常显示,空间不够就会出现滚动条。
      

  5.   

    那么我要实现同样的效果应该怎么解决呢,有替代Flowlayout而又能自动换行的容器没有啊
      

  6.   

    方法一:
    设置你使用了 Flowlayout 的那个控件的 PreferredSize
    即调用 setPreferredSize 方法,或者重写其 getPreferredSize 方法
    使它的宽度固定,即使包在 JScrollPane 里也会换行方法二:
    不要用 JScrollPane
    这你把需求详细说一下,比如为什么你要用 JScrollPane?
    才能给你更多的参考
      

  7.   

    我把好多图标加到Flowlayout控件里面了,所以要滚屏查看下面的,出了用JScrollPane还有其他方法吗
      

  8.   

    import java.awt.*;
    import java.awt.event.*;
    import java.sql.*;
    //import java.util.EventListener;
    import javax.swing.*;
    import javax.swing.event.ListSelectionEvent;
    import javax.swing.event.ListSelectionListener;
    import javax.swing.event.TreeSelectionEvent;
    import javax.swing.event.TreeSelectionListener;
    import javax.swing.tree.DefaultMutableTreeNode;
    import javax.swing.tree.DefaultTreeModel;
    import javax.swing.tree.TreeNode;
    import javax.swing.tree.TreePath;public class CopyOfMainFrame extends JFrame implements TreeSelectionListener, MouseListener { private Connection con=null;
        private Statement st=null;
        
    private DefaultTreeModel model; 
    private JPopupMenu pop; 
    private JTree jtree; JPopupMenu popup = new  JPopupMenu(); JMenuItem  item1 = new  JMenuItem("修  改");    
    JMenuItem  item2 = new  JMenuItem("刷  新");  
    JMenuItem  item3 = new  JMenuItem("删  除");    private String dbURL = "jdbc:mysql://localhost/book?useUnicode=true&characterEncoding=GBK"; // 数据库标识名
    private String user = "root"; // 数据库用户
    private String password = ""; // 数据库用户密码
    private Panel borderpanel = new Panel();

    private Panel flowpanel;


    private JTextArea jta1 = new JTextArea("\n"+"序号:" +""+ "\t书名:" + "" + "\t副标题:" + ""
    + "\t作者:" + "" + "\t国籍:" + "" + "\t出版社:" + "" + "\t价格:" + ""+ "\tISBN:" + ""
    +"\n"+"\n"+"\n"+"\n"+"\n"+"\n"+"\n"+"\n"+"\n"+"\n"+"\n");

    private void init(){
            try{
                Class.forName("com.mysql.jdbc.Driver"); // 加载驱动器
                con = DriverManager.getConnection(dbURL, user, password); // 获取连接
                st = con.createStatement(); // 获取Statement对象
            }catch(Exception e){
                e.printStackTrace();
            }
            
        }

     
    public CopyOfMainFrame(String title) throws SQLException, ClassNotFoundException {
    super(title);

    init();

    MenuBar mb = new MenuBar();
    this.setMenuBar(mb);
    Menu m1 = new Menu("菜单");
    Menu m2 = new Menu("编辑");
    Menu m3 = new Menu("帮助");
    mb.add(m1);
    mb.add(m2);
    mb.add(m3);
    MenuItem mi1 = new MenuItem("添加一本书");
    mi1.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
    AddBook aa=new AddBook();
    aa.setVisible(true);
    }
    });    MenuItem mi2 = new MenuItem("退出");
    mi2.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
    System.exit(0);
    }
    });

    MenuItem mi3 = new MenuItem("关于");
    mi3.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
    JOptionPane.showMessageDialog(null,"Version v0.01");
    }
    });

    m1.add(mi1);
    m1.add(mi2);
    m3.add(mi3);
    //获取屏幕分辨率
    int screenWidth = ((int)java.awt.Toolkit.getDefaultToolkit().getScreenSize().width);        
    int screenHeight = ((int)java.awt.Toolkit.getDefaultToolkit().getScreenSize().height); setSize(screenWidth-250, screenHeight-100);// 窗口大小1024*768
    setLocation(0,0);// 距离左上角图标距离0,0            
    setLayout(new BorderLayout());

    setLocationRelativeTo(null);      //界面居中
     this.addWindowListener(new WindowAdapter(){             @Override
                public void windowClosing(WindowEvent arg0) {
                    try{
                        if(st!=null)
                            st.close();
                        if(con!=null)
                            con.close();
                        System.exit(0);
                    }catch(Exception e){
                        e.printStackTrace();
                        System.exit(1);
                    }
                    
                }
                
            });
     
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 关闭窗口时退出程序

    //树组件的绘制
    TreeNode root =setJTree();
    model = new DefaultTreeModel(root); 
    jtree = new JTree(model); 
    jtree.setEditable(true); 
    jtree.addMouseListener(this); 
    JScrollPane scrollPane = new JScrollPane(jtree); 
    add(scrollPane, BorderLayout.WEST); 

    setFlowLayoutPanel();
    add(flowpanel,FlowLayout.LEFT); 

    add(jta1,BorderLayout.SOUTH);  }
    private TreeNode setJTree() {
    jtree=new JTree();
    DefaultMutableTreeNode root = new DefaultMutableTreeNode("书籍收藏");
    DefaultMutableTreeNode root1 = new DefaultMutableTreeNode("收藏夹");
    DefaultMutableTreeNode root2 = new DefaultMutableTreeNode("阅读列表");
    DefaultMutableTreeNode root3 = new DefaultMutableTreeNode("搜索结果");
    DefaultMutableTreeNode root4 = new DefaultMutableTreeNode("所有书籍");
    DefaultMutableTreeNode root5 = new DefaultMutableTreeNode("回收站");
    //ye-爷;fu-父;zi-子
    DefaultMutableTreeNode ye = new DefaultMutableTreeNode("计算机类"); 
    root.add(ye); 
    DefaultMutableTreeNode fu = new DefaultMutableTreeNode("数据库"); 
    ye.add(fu); 
    DefaultMutableTreeNode zi = new DefaultMutableTreeNode("SQL数据库"); 
    fu.add(zi); 
    zi = new DefaultMutableTreeNode("程序语言"); 
    fu.add(zi); 
    fu = new DefaultMutableTreeNode("软件"); 
    ye.add(fu); 
    zi = new DefaultMutableTreeNode("C语言"); 
    fu.add(zi); 
    ye = new DefaultMutableTreeNode("经济类"); 
    root.add(ye); 
    fu = new DefaultMutableTreeNode("宏观经济"); 
    ye.add(fu); 
    fu = new DefaultMutableTreeNode("微观经济"); 
    ye.add(fu); 
    root.add(root1);
    root.add(root2);
    root.add(root3);
    root.add(root4);
    root.add(root5);
    //树的数据模型
    DefaultTreeModel model = new DefaultTreeModel(root);
    //设置数据模型
    jtree.setModel(model);
    // 展开所有树
    for (int i = 0; i < jtree.getRowCount(); i++)
    jtree.expandRow(i);
    //添加事件
    jtree.addTreeSelectionListener(this); return root;  } @Override
    public void valueChanged(TreeSelectionEvent arg0) {
    // TODO Auto-generated method stub } public void setFlowLayoutPanel() throws SQLException,ClassNotFoundException {
    flowpanel = new Panel();

    FlowLayout flowlayout = new FlowLayout();


    //borderlayout.setAlignment(BorderLayout.N);//设置图标靠左
    flowpanel.setLayout(flowlayout); popup.add(item1);//右键菜单
    popup.add(item2);
    popup.add(item3);
    borderpanel.add(popup);
    String sqlStr = "select * from user"; // SQL查询语句
    ResultSet rs = st.executeQuery(sqlStr); // 执行查询 while (rs.next()) { // 遍历ResultSet
    String str=rs.getString("url");
    final String strid=rs.getString("id"); // 获取数据
    final String strtitle=rs.getString("title");
    final String strsubhead=rs.getString("subhead");
    final String strauthors=rs.getString("authors");
    final String strnationality=rs.getString("nationality");
    final String strpublisher=rs.getString("publisher");
    final String strprice=rs.getString("price");
    final String strisbn=rs.getString("isbn");

    JButton btnSmall=new JButton("");
    //JButton btnSmall=new JButton(strtitle);//图片+文字显示

    ImageIcon icon = new ImageIcon(str);
    btnSmall.setIcon(scaleImage(icon));

    btnSmall.setSize(100, 150);
    btnSmall.setVisible(true);
    btnSmall.invalidate();   flowpanel.add(btnSmall);
     
    }
    } private ImageIcon scaleImage(ImageIcon icon) { int width = icon.getIconWidth();
    // System.out.print(width);
    int height = icon.getIconHeight();
    // if (width <= 100 && height <= 150) {
    // return icon;
    // }
    Image image = icon.getImage();
    image = image.getScaledInstance(100, 150, Image.SCALE_DEFAULT);
    return new ImageIcon(image);
    }
    public static void main(String[] args) throws SQLException,ClassNotFoundException 
    {
    CopyOfMainFrame yf = new CopyOfMainFrame("我的书架");
    yf.setVisible(true);
    }

    @Override
        public void mouseClicked(MouseEvent arg0) {
            // 获取选择的节点
            DefaultMutableTreeNode node = (DefaultMutableTreeNode) jtree.getLastSelectedPathComponent();
            if(!node.isLeaf())
            {
                return ;
            }
            flowpanel.removeAll();
            System.out.println(node.getUserObject());
            String sqlStr="select * from user where classified ='"+node.getUserObject().toString()+"'";
            try{
                ResultSet rs = st.executeQuery(sqlStr); // 执行查询
                while (rs.next()) { // 遍历ResultSet
                    String str = rs.getString("url");
                    final String strid = rs.getString("id"); // 获取数据
                    final String strtitle = rs.getString("title");
                    final String strsubhead = rs.getString("subhead");
                    final String strauthors = rs.getString("authors");
                    final String strnationality = rs.getString("nationality");
                    final String strpublisher = rs.getString("publisher");
                    final String strprice = rs.getString("price");
                    final String strisbn = rs.getString("isbn");
                    
                    //JButton btnSmall = new JButton(strtitle);
                    JButton btnSmall = new JButton("");
                    
                    ImageIcon icon = new ImageIcon(str);
         btnSmall.setIcon(scaleImage(icon));
                    
                    btnSmall.setSize(100, 150);
                    btnSmall.setVisible(true);
                    btnSmall.invalidate();                flowpanel.add(btnSmall);           
                    
                }
            }catch(Exception e){
                e.printStackTrace();
            }
            flowpanel.repaint();
            flowpanel.validate();
           
            
        } @Override
    public void mouseEntered(MouseEvent arg0) {
    // TODO Auto-generated method stub }
    @Override
    public void mouseExited(MouseEvent arg0) {
    // TODO Auto-generated method stub }
    @Override
    public void mousePressed(MouseEvent arg0) {
    // TODO Auto-generated method stub }
    @Override
    public void mouseReleased(MouseEvent arg0) {
    // TODO Auto-generated method stub }
    }