java - Java 中的滑动面板

标签 java c# jpanel

+--+-------+-------------+        +-------+-------+--------+
|  |       |             |        |       |       |        |
|  | Zone  |             |        |       | Zone  |        |
|  |       |             |   ->   |       |       |        |
|  | show  |             |        |       | show  |        |
|  |       |             |        |       |       |        |
+--+-------+-------------+        +-------+-------+--------+

I got a UserControl in C#, based on this post. When an user clicks one of the buttons, i changed the Panel.Left property, so the zone showed changes, calculating it with the left edge. I want this functionality in java. This is the code i did in c#:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using TimeSheets.DataModels;
using System.Diagnostics;

namespace TimeSheets.UserControls
{
    public partial class Tab : UserControl, TabItemClickListener
    {
        public TabListener Listener { get; set; }
        private TabItem selectedItem;
        private DateTime startTime;

        public int ItemHeight { get; set; }
        public int ItemWidth { get; set; }

        public TabItem SelectedItem
        {
            get { return selectedItem; }
            set
            {
                if (value != null)
                {
                    selectedItem = value;
                    selectedIndex = panel.Controls.GetChildIndex(value, false);
                    CambiarSeleccion(selectedIndex);
                }

            }
        }

        private int selectedIndex;
        public int SelectedIndex
        {
            get { return selectedIndex; }
            set
            {
                selectedIndex = value;
                if (selectedIndex >= 0 && selectedIndex <= panel.Controls.Count && panel.Controls.Count != 0)
                    CambiarSeleccion(selectedIndex);
            }
        }

        public Tab()
        {
            InitializeComponent();
            panel.Height = this.Height;
        }

        public void AddTabItem(TabItem item)
        {
            item.SetWidth(ItemWidth);
            item.SetHeight(ItemHeight);
            item.handler = this;
            panel.Width += ItemWidth;
            panel.Width += 6;
            panel.Controls.Add(item);
        }

        public void LimpiarPaneles()
        {
            panel.Controls.Clear();
        }

        public TabItem GetTabItem(int position)
        {
            return (TabItem)panel.Controls[position];
        }

        public Object GetValueAt(int position)
        {
            if (selectedIndex >= 0 && selectedIndex <= panel.Controls.Count && panel.Controls.Count != 0)
                return ((TabItem)panel.Controls[position]).Value;
            else
                return null;
        }

        private void tLeft_Tick(object sender, EventArgs e)
        {
            if (panel.Left < 0)
            {
                panel.Left = panel.Left + 5;
            }
        }

        private void tRight_Tick(object sender, EventArgs e)
        {
            //Debug.WriteLine(panel.Width + "panel.Right" + panel.Right + "this.Left" + panel.Left + "panel1.Width" + panel1.Width);
            if (panel.Width >= Math.Abs(panel.Left) + panel1.Width)
            {
                panel.Left = panel.Left - 5;
            }
        }

        private void bRight_MouseUp(object sender, MouseEventArgs e)
        {
            tRight.Stop();
        }

        private void bRight_MouseDown(object sender, MouseEventArgs e)
        {
            startTime = DateTime.Now;
            tRight.Start();
        }

        private void bLeft_MouseUp(object sender, MouseEventArgs e)
        {
            tLeft.Stop();
        }

        private void bLeft_MouseDown(object sender, MouseEventArgs e)
        {
            startTime = DateTime.Now;
            tLeft.Start();
        }


        public new void Click(TabItem item)
        {
            selectedIndex = panel.Controls.GetChildIndex(item, false);
            panel.Left = -selectedIndex * (ItemWidth + 6);
            CambiarSeleccion(selectedIndex);
        }

        private void CallListener()
        {
            if (Listener != null)
                Listener.OnItemSelected(selectedIndex);
        }

        private void bRight_Click(object sender, EventArgs e)
        {
            if ((DateTime.Now - startTime).Milliseconds <= 150)
            {
                if (selectedIndex < panel.Controls.Count - 1)
                    selectedIndex++;
                CambiarSeleccion(selectedIndex);
            }
        }

        private void bLeft_Click(object sender, EventArgs e)
        {
            if ((DateTime.Now - startTime).Milliseconds <= 150)
            {
                if (selectedIndex > 0)
                    selectedIndex--;
                CambiarSeleccion(selectedIndex);
            }
        }

        private void CambiarSeleccion(int newIndex)
        {
            if (selectedIndex >= 0 && selectedIndex <= panel.Controls.Count || panel.Controls.Count != 0)
            {
                if (selectedItem != null)
                    selectedItem.Deseleccionar();

                CallListener();

                selectedItem = GetTabItem(selectedIndex);
                selectedItem.Seleccionar();
                panel.Left = -selectedIndex * (ItemWidth + 6) - 2;
            }
        }

        public void SetActivado(bool activo)
        {
            bLeft.Enabled = activo;
            bRight.Enabled = activo;
        }
    }

    public interface TabListener
    {
        void OnItemSelected(int selected);
    }
}

现在我想将它翻译成Java。我已经完成了所有工作,但我找不到像 Left 属性这样的东西来使用它。有什么我错过的吗?

最佳答案

终于我开始工作了,我的自定义 Jpanel 在西边和东边有两个按钮,中间有一个空布局面板,第一个面板内有一个流布局面板。当我按下鼠标时,它开始滑动,以显示 DataTabItems(只是另一个带有按钮的面板)。该类的目标是从列表中选择一项并在任意位置显示某些内容。

这是DataTab的代码:

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.morethansimplycode.crud;

import com.morethansimplycode.data.Data;
import java.awt.Rectangle;
import java.util.List;
import javax.swing.Timer;

/**
 *
 * @author Oscar Date 21-may-2015 Time 22:15:09
 */
public class DataTab extends javax.swing.JPanel {

    private final Timer tLeft = new Timer(6, (e) -> {
        if (DataTab.this.tabContainer.getX() < 0)
            left(5);
        System.out.println("left" + DataTab.this.tabContainer.getX());

    });
    private final Timer tRight = new Timer(6, (e) -> {
        if (DataTab.this.tabContainer.getWidth() >= Math.abs(DataTab.this.tabContainer.getX()) + DataTab.this.panel.getWidth())
            left(-5);
        System.out.println("right" + DataTab.this.tabContainer.getX());
    });

    private Data[] data;

    /**
     * Creates new form DataTab
     */
    public DataTab() {

        initComponents();        
    }

    public void setData(Data[] data) {

        this.data = data;
        generateTabItems();
    }

    public void setData(List<Data> data) {

        this.data = data.toArray(new Data[data.size()]);
        generateTabItems();
    }

    private void generateTabItems() {

        tabContainer.setBounds(tabContainer.getBounds().x, tabContainer.getBounds().y,tabContainer.getBounds().width + 10, panel.getBounds().height);

        for (Data d : data) {

            DataTabItem item = new DataTabItem(d, 275, 275);
            tabContainer.add(item);
            tabContainer.setSize(tabContainer.getWidth() + item.getPreferredSize().width + 10, tabContainer.getHeight());
            System.out.println(tabContainer.getComponentCount() + " " + item.getSize());
        }

        this.updateUI();
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        bLeft = new javax.swing.JButton();
        bRight = new javax.swing.JButton();
        panel = new javax.swing.JPanel();
        tabContainer = new javax.swing.JPanel();

        setMinimumSize(new java.awt.Dimension(85, 40));
        setPreferredSize(new java.awt.Dimension(200, 20));
        addComponentListener(new java.awt.event.ComponentAdapter() {
            public void componentResized(java.awt.event.ComponentEvent evt) {
                resize(evt);
            }
        });
        setLayout(new java.awt.BorderLayout());

        bLeft.setText("<");
        bLeft.setMargin(new java.awt.Insets(0, 0, 0, 0));
        bLeft.setMaximumSize(new java.awt.Dimension(10, 19));
        bLeft.setMinimumSize(new java.awt.Dimension(10, 19));
        bLeft.setPreferredSize(new java.awt.Dimension(40, 10));
        bLeft.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mousePressed(java.awt.event.MouseEvent evt) {
                bLeftPressed(evt);
            }
            public void mouseReleased(java.awt.event.MouseEvent evt) {
                bLeftReleased(evt);
            }
        });
        bLeft.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                bLeftActionPerformed(evt);
            }
        });
        add(bLeft, java.awt.BorderLayout.WEST);

        bRight.setText(">");
        bRight.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mousePressed(java.awt.event.MouseEvent evt) {
                bRightMousePressed(evt);
            }
            public void mouseReleased(java.awt.event.MouseEvent evt) {
                bRightMouseReleased(evt);
            }
        });
        bRight.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                bRightActionPerformed(evt);
            }
        });
        add(bRight, java.awt.BorderLayout.EAST);

        panel.setBackground(new java.awt.Color(255, 255, 255));
        panel.setLayout(null);

        tabContainer.setBackground(new java.awt.Color(102, 0, 204));
        tabContainer.setLayout(new java.awt.FlowLayout(java.awt.FlowLayout.CENTER, 10, 5));
        panel.add(tabContainer);
        tabContainer.setBounds(0, 0, 0, 40);

        add(panel, java.awt.BorderLayout.CENTER);
    }// </editor-fold>                        

    private void bRightActionPerformed(java.awt.event.ActionEvent evt) {                                       


    }                                      

    private void bLeftActionPerformed(java.awt.event.ActionEvent evt) {                                      


    }                                     

    private void resize(java.awt.event.ComponentEvent evt) {                        

        System.out.println(tabContainer.getBounds());
        tabContainer.setBounds(tabContainer.getBounds().x, tabContainer.getBounds().y,tabContainer.getBounds().width, panel.getBounds().height);
        System.out.println(tabContainer.getBounds());
        this.updateUI();
    }                       

    private void bLeftPressed(java.awt.event.MouseEvent evt) {                              

        tLeft.start();
    }                             

    private void bLeftReleased(java.awt.event.MouseEvent evt) {                               

        tLeft.stop();
    }                              

    private void bRightMousePressed(java.awt.event.MouseEvent evt) {                                    

        tRight.start();
    }                                   

    private void bRightMouseReleased(java.awt.event.MouseEvent evt) {                                     

        tRight.stop();
    }                                    

    private void left(int movePixels) {

        Rectangle r = tabContainer.getBounds();
        r.x += movePixels;
        tabContainer.setBounds(r);
    }

    // Variables declaration - do not modify                     
    private javax.swing.JButton bLeft;
    private javax.swing.JButton bRight;
    private javax.swing.JPanel panel;
    private javax.swing.JPanel tabContainer;
    // End of variables declaration                   

}

这是 DataTabItem 类:

package com.morethansimplycode.crud;

import com.morethansimplycode.data.Data;
import java.awt.Dimension;

/**
 *
 * @author Oscar
 * Date 21-may-2015
 * Time 22:26:21
 */
public class DataTabItem extends javax.swing.JPanel {

    Data value;

    /** Creates new form DataTabItem */
    public DataTabItem() {

        initComponents();
    }

    public DataTabItem(Data d, int height, int width) {

        initComponents();
        value = d;
        button.setPreferredSize(new Dimension(width, height));
        this.setPreferredSize(new Dimension(width, height));
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        button = new javax.swing.JButton();

        setBackground(new java.awt.Color(255, 255, 255));
        setLayout(new java.awt.BorderLayout());

        button.setBackground(new java.awt.Color(102, 102, 255));
        button.setText("PACO");
        button.setMaximumSize(new java.awt.Dimension(2147483647, 2147483647));
        button.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                buttonActionPerformed(evt);
            }
        });
        add(button, java.awt.BorderLayout.CENTER);
    }// </editor-fold>                        

    private void buttonActionPerformed(java.awt.event.ActionEvent evt) {                                       
        System.out.println("hola");
    }                                      


    // Variables declaration - do not modify                     
    private javax.swing.JButton button;
    // End of variables declaration                   

}

感谢其他答案,并希望此代码可以帮助任何需要此代码的人。

关于java - Java 中的滑动面板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30384393/

相关文章:

java - RMI : determine the IP address of a remote object

java - 正则表达式在Java中获取两个标签之间的结果

c# - 在发布版本中反射(reflect)堆栈跟踪是否危险?

java - JFrame 和 JPanel

java - 使用 GridLayout 更改 JPanel 内的组件

Java 2D ArrayList 和排序

java - 我可以结合java8(流,lambda)和 Guava 吗?

c# - 为多个消费者读取一次流

c# - 如何从资源中获取字符串以在 xaml 的 WPF 资源部分中分配

java - 在 JPanel 之间传递数据