+--+-------+-------------+ +-------+-------+--------+ | | | | | | | | | | 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/